MySQL复杂索引是否涉及简单索引?

时间:2014-03-05 23:45:25

标签: mysql

如果我设置一个多列索引 - 例如 - 用列(A,B)并且单独用A或B搜索,它们是否会像在A和B中也有简单的索引一样快?

这些额外的简单索引是否必要?

2 个答案:

答案 0 :(得分:2)

来自MYSQL:MySQl 5 Reference

如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上建立索引搜索功能。

如果列不构成索引的最左前缀,则MySQL无法使用索引。假设您有SELECT语句:

SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

如果(col1,col2,col3)上存在索引,则只有前两个查询使用索引。第三个和第四个查询确实涉及索引列,但(col2)和(col2,col3)不是(col1,col2,col3)的最左前缀。

答案 1 :(得分:1)

如果创建任何索引(A,B),MySQL可以将该索引用于仅包含A或A的查询和排序。它不能将其用于“B”。基本思想是索引的任何前缀都是有用的。

您不必为“A”创建单独的一个,但如果要对B进行排序或在没有“A”的where子句中使用,则需要一个“B”。