我在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
注意:这不是使用多列索引,而是使用上表描述的结果。
答案 0 :(得分:13)
您应该在(primaryId,imgDate)上使用多列索引,以便MySQL能够使用它来选择行和排序。
如果用于排序的所有列都不在用于选择的索引中,MySQL使用“ filesort ”策略,该策略包括对所有行进行排序(如果没有太多行,则在内存中) ;在磁盘上其他)。
如果用于排序的所有列都在索引中,MySQL使用索引来获取行顺序(有一些限制)。
MySQL使用索引的树结构。这允许直接访问键而不进行排序。
多列索引基本上是列连接的索引。这允许MySQL找到匹配primaryId={$imgId}
的第一行,然后以正确的顺序直接访问所有其他行。
在primaryId
上使用单行索引,MySQL可以找到与primaryId={$imgId}
匹配的所有行,但它会找到没有特定顺序的行;所以它必须在那之后对它们进行排序。
答案 1 :(得分:11)
你的解释如下:
[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
让我们一起来看看。
[id] => 1
意味着我们在讨论第一张桌子。你只是在你的陈述中调用一个表。
[select_type] => SIMPLE
我们正在做一个简单的SELECT。
[table] => secondary_images
有问题的表名。
[type] => ref
选择类型,对连接最重要。
[possible_keys] => primaryId
这是一个重要字段:它显示了可以使用哪些键来帮助查询执行得更快。在这种情况下,只有您的主键被认为是有用的。
[key] => primaryId
这是一个重要字段:它显示最终使用了哪些键。在这种情况下,主键。
[key_len] => 5
[ref] => const
[rows] => 1
猜测查询检查的行数。
[Extra] => Using where; Using filesort
最重要的字段 imho。 - 使用where:您正在使用where语句。很好。 - 使用filesort:查询结果如此之大,不可能 在内存中排序。 MySQL必须将其写入文件,对文件进行排序,以及 然后输出。这意味着磁盘访问并将减慢一切。 添加可以帮助排序的索引通常有助于解决问题 “使用filesort”本身就是一章。