【发布时间】:2012-04-15 13:30:14
【问题描述】:
我有一个具有这种结构的表(有 50k 个字段):
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 ;
我想通过 imageid 选择数据并使用 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 的索引吗?
-
是的,你可以看到我添加了一个密钥 KEY
ids(imageid,adate) USING BTREE -
如果您在第一个示例中仅选择 cmets.id 有什么不同吗?根据我的经验,我可以说:检查这一点的最简单方法是通过速度。将您的 50k 条目增加三倍,并搜索在特定字段上使用和不使用索引来衡量速度的东西。
标签: mysql indexing sql-order-by