如果在查询中使用索引列的子集,是否会保留索引的MySQL查询性能优势?

时间:2014-11-12 13:32:09

标签: mysql database-indexes

如果运行查询索引中某些列的某个子集的SELECT语句,我是否可以保持在MySQL表上为多个列设置索引的性能和效率优势?

所以,如果我在列A,B和C上设置了索引,但是我的语句只查询列A和B,那就像没有索引设置一样。我是否需要专门为A和B设置另一个索引,以便通过查询获得任何性能优势?

2 个答案:

答案 0 :(得分:2)

对一般问题的简短回答:这取决于

答案很长:

DB根据表的统计信息构建解释计划。基本上,数据库引擎估计每次操作需要多少“努力”,在这种情况下,两个主要因素是索引数据大小和索引数据的分布。

数据分发 如果前两列数据粒度较低(例如值的一些可能值,列A代表性别列B代表年龄),那么优化器很可能更愿意读取整个表而不是使用索引。 **在这种情况下,仅在A上添加索引,B将无用**

**索引数据大小** 另一个因素是列C中的数据大小。列C中的数据大小直接影响索引大小。因为读索引树也需要IO索引越大,成本就越高。 假设C列中的数据是注释,平均注释大小为500个字符。数据可能有很多可能的值,但索引将是一个非常大的索引。这也可能导致DB更喜欢读取整个表而不是使用索引。 **在这种情况下,在A上添加索引,B很有用**

答案 1 :(得分:1)

请参阅此答案:https://stackoverflow.com/a/20939127/2520738

基本上:

  

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

所以基本上,是的,如果您的索引从左到右读取A,B,C,您可以搜索A,A和B,A和B以及C.如果您没有单列索引B或C则在单独搜索时不会使用索引。