【发布时间】:2011-11-07 20:37:21
【问题描述】:
我在 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
注意:这不是使用多列索引,而是使用上表描述的结果。
【问题讨论】:
-
你能发布选择的解释吗? :)
-
请记住,indeces 不是免费的。如果您有多个索引,这意味着在每次插入或更新时,每个索引都需要更新。您需要权衡这些更新对性能的影响与您在检索时将看到的性能改进。
-
@stef:啊哈!你即将学到一些非常有用的东西。执行 SELECT 查询,但在其前面添加
explain关键字:explain SELECT imgURL, view FROM secondary_images WHERE primaryId={$imgId} ORDER BY imgDate DESC。阅读Optimizing Queries With Explain。 -
这真的取决于你的桌子的大小。需要注意的是运行 EXPLAIN 并查看 MySQL 是否真的在使用您的索引。如果有很多重复项,它可能会决定不使用它。我有一本书称之为“扫描与搜索”问题。基本上,你会做类似
SELECT COUNT (DISTINCT primaryId) FROM secondary_images和SELECT COUNT(*) FROM secondary_images的事情并计算比率。数字越大,“选择性”越高。如果数字太低,它不会成为有用的索引。 -
ALTER TABLE secondary_images DROP INDEX primaryId, DROP INDEX imgDate, ADD INDEX IdNDate (imgId DESC, primaryId ASC) ;之类的东西应该可以解决问题。
标签: mysql database database-design indexing query-optimization