我试图索引blogentries
数据库以获得更好的性能,但是发现了一个问题。
结构如下:
CREATE TABLE IF NOT EXISTS `blogentries` (
`id_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title_id` varchar(100) COLLATE latin1_german2_ci NOT NULL,
`entry_id` varchar(5000) COLLATE latin1_german2_ci NOT NULL,
`date_id` int(11) NOT NULL,
PRIMARY KEY (`id_id`)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1
COLLATE=latin1_german2_ci
AUTO_INCREMENT=271;
如下查询将正确使用索引:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + -------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | select_type | 桌子| 类型 可能的钥匙| 关键 key_len | 参考| 行| 额外| + ---- + -------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | 简单 博客条目| 索引| NULL | 主要| 114 | NULL | 126 | 使用索引 + ---- + -------------- + ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
但是,当我entry_id
在SELECT
查询中添加时,它将使用文件排序
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | id | select_type | 桌子| 类型 可能的钥匙| 关键 key_len | 参考| 行| 额外| + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- + | 1 | 简单 博客条目| 全部| NULL | NULL | NULL | NULL | 126 | 使用文件排序| + ---- + ------------- + ------------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ ---- +
我想知道为什么会这样,如何避免呢?是由于造成的VarChar
,应该将其更改为其他内容吗?
我试图让我所有的查询都使用索引,因为我遇到了高值Handler_read_rnd
和Handler_read_rnd_next
值。
如果您需要任何其他信息,我也可以发布。
WHERE 1=1
到第二个查询。