我在MySQL数据库中有如下表:
CREATE TABLE `secondary_images` (
`imgId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`primaryId` int(10) unsigned DEFAULT NULL,
`view` varchar(255) DEFAULT NULL,
`imgURL` varchar(255) DEFAULT NULL,
`imgDate` datetime DEFAULT NULL,
PRIMARY KEY (`imgId`),
KEY `primaryId` (`primaryId`),
KEY `imgDate` (`imgDate`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
SQL 语句如下:
SELECT imgURL, view FROM secondary_images
WHERE primaryId={$imgId} ORDER BY imgDate DESC
你可以看到我将primaryId
和imgDate
都设置为索引键。我的想法是因为WHERE
子句使用primaryId
查询结果,而ORDER
子句使用imgDate
。
我的问题是,像我现在这样使用多个索引是否更好?还是应该使用多列索引(这是我目前不太理解的东西)?
这是我从EXPLAIN得到的:
id = 1
select_type = simple
table = secondary_images
type = ref
possible_keys = primaryId
key = primaryId
key_len = 5
ref = const
rows = 1
extra = Using where; Using filesort
注意: 这并不使用多列索引,而是通过使用上述表描述的结果。
explain
关键字:explain SELECT imgURL, view FROM secondary_images WHERE primaryId={$imgId} ORDER BY imgDate DESC
。阅读使用Explain优化查询。 - KonerakSELECT COUNT(DISTINCT primaryId) FROM secondary_images
和SELECT COUNT(*) FROM secondary_images
的操作,并计算比率。数字越大,“选择性”就越高。如果数字太低,则不会产生有用的索引。 - PoodlehatALTER TABLE secondary_images DROP INDEX primaryId, DROP INDEX imgDate, ADD INDEX IdNDate (imgId DESC, primaryId ASC) ;
这样的语句应该可以解决问题。 - Poodlehat