我有一个像这样的表(为了便于解释,我删除了很多字段)。 orderId是一个int非唯一值,用于显示行的重要性(返回数据时我按行排序)
CREATE TABLE `my_images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orderId` int(11) NOT NULL,
`slug` varchar(50) NOT NULL,
`imageFilename` varchar(255) NOT NULL,
`thumb200` varchar(255) NOT NULL,
`thumb600` varchar(255) NOT NULL,
`md5hash` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `orderId` (`orderId`),
KEY `thumb600` (`thumb600`),
KEY `slug` (`slug`),
KEY `multiple_1` (`md5hash`,`orderId`,`thumb200`,`thumb600`),
KEY `md5hash` (`md5hash`),
KEY `thumb200` (`thumb200`),
KEY `thumb200_2` (`thumb200`,`orderId`),
KEY `orderId_2` (`orderId`,`thumb600`,`thumb200`),
KEY `thumb600_2` (`thumb600`,`orderId`),
KEY `thumb600_3` (`thumb600`,`orderId`),
KEY `orderId_3` (`orderId`,`thumb600`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
是的-有很多索引涵盖orderId。 它是为解决当前问题而进行尝试的混合方式,也因为我在WHERE语句中使用了这些字段。
无论如何,如果我运行此命令:
explain SELECT id FROM my_images
ORDER BY orderId asc
它输出这个(“使用索引”)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE my_images index NULL orderId 4 NULL 174553 Using index
这是预期的-orderId是一个索引。
但是如果我这样做:
explain SELECT id, thumb600, imageFilename, slug FROM my_images
ORDER BY orderId asc
它输出以下内容(使用文件排序):
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE my_images ALL NULL NULL NULL NULL 174553 Using filesort
如果我这样做很奇怪
explain SELECT id, md5hash FROM my_images
ORDER BY orderId asc
它说“使用索引;使用文件排序”
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE my_images index NULL multiple_1 775 NULL 174553 Using index; Using filesort
我注意到的原因是因为我看到了一个缓慢的查询,该查询基本上是“按orderId限制4000,3选择(一堆字段)order”,这花了很长时间,在运行了explain命令后看到了这一点。 怎么办才能始终使用索引? 我是否必须建立一个包含我选择的所有字段的索引? 如果是这样,索引中字段的顺序是否重要?