如果运行查询索引中某些列的某个子集的SELECT语句,我是否可以保持在MySQL表上为多个列设置索引的性能和效率优势?
所以,如果我在列A,B和C上设置了索引,但是我的语句只查询列A和B,那就像没有索引设置一样。我是否需要专门为A和B设置另一个索引,以便通过查询获得任何性能优势?
答案 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则在单独搜索时不会使用索引。