多列索引与多个索引

时间:2011-08-31 18:19:26

标签: mysql database database-design indexing query-optimization

我在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

正如您所看到的,我创建了primaryIdimgDate索引键。我的想法是因为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

注意:这不是使用多列索引,而是使用上表描述的结果。

2 个答案:

答案 0 :(得分:13)

您应该在(primaryId,imgDate)上使用多列索引,以便MySQL能够使用它来选择行和排序。

如果用于排序的所有列都不在用于选择的索引中,MySQL使用“ filesort ”策略,该策略包括对所有行进行排序(如果没有太多行,则在内存中) ;在磁盘上其他)。

如果用于排序的所有列都在索引中,MySQL使用索引来获取行顺序(有一些限制)。

MySQL使用索引的树结构。这允许直接访问键而不进行排序。

多列索引基本上是列连接的索引。这允许MySQL找到匹配primaryId={$imgId}的第一行,然后以正确的顺序直接访问所有其他行。

primaryId上使用单行索引,MySQL可以找到与primaryId={$imgId}匹配的所有行,但它会找到没有特定顺序的行;所以它必须在那之后对它们进行排序。

请参阅EXPLAINORDER BY Optimization

答案 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”本身就是一章。