我有一個表,這個結構(有50K字段):MySQL不與使用ORDER BY指數
CREATE TABLE IF NOT EXISTS `comments` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`imageid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` bigint(20) unsigned NOT NULL DEFAULT '0',
`content` text CHARACTER SET utf8,
`adate` datetime DEFAULT NULL,
`ip` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `ids` (`imageid`,`adate`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=52236 ;
我想通過圖像標識來選擇數據和ADATE所以我加了(imageid
排序, adate
)鍵。
但是這個查詢的解釋結果說MuSQL仍然使用表掃描。爲什麼?!
EXPLAIN SELECT comments.*
FROM comments
WHERE comments.imageid=50
ORDER BY
comments.adate DESC LIMIT 10
結果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE comments ref ids ids 4 const 203 Using where
,並用此指標:
KEY `ids` (`imageid`,`adate`,`id`) USING BTREE
結果此查詢:
EXPLAIN SELECT comments.id
FROM comments
WHERE comments.imageid=50
ORDER BY
comments.adate DESC LIMIT 10
爲:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE comments ref ids ids 4 const 203 Using where; Using index
您是否有關於imageid的索引? – Arion 2012-04-15 13:32:59
是的,你可以看到我已經添加了一個關鍵的KEY'ID'('imageid','adate')使用BTREE – MscEliot 2012-04-15 13:42:45
如果你在第一個例子中只選擇comments.id,它會有什麼不同嗎? 從我的經驗我可以說:最簡單的方法來檢查這是通過速度。將您的50k條目加倍並搜索某些東西,測量具體和非指標的速度。 – func0der 2012-04-15 14:09:38