【问题标题】:Are the MySQL query performance benefits of indices retained if a subset of the index columns are used in a query?如果在查询中使用索引列的子集,是否保留了索引的 MySQL 查询性能优势?
【发布时间】:2014-11-12 13:32:08
【问题描述】:

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

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

【问题讨论】:

  • 所以,如果我运行像 select * from T where A = 'blah' 这样的查询,并且我在 A、B 和 C 列上有一个名为 MyKey 的 key 设置,explain 告诉我我的 MyKey 将被选为那个特定的查询,这是否意味着我正在获得使用键/索引的索引优化?
  • 就像@rene 建议的那样,用 EXPLAIN 试试,你会看到的。
  • 在这种情况下,验光师很可能会选择在您索引之后进行。根据假设的 A、B 索引和现有 A、B、C 索引之间的粒度差异,您很可能会发现使用第二个 A、B 索引的性能更好,但会产生存储空间成本以及写入成本附带索引。除非您的表很大并且粒度差异很大,否则您可能对原来的 A、B、C 索引没问题。
  • 请注意,对于索引中列的子集,它还取决于列。因此,如果您有一个涵盖列 A、B 和 C 的索引,那么检查列 A 的 WHERE 子句可以使用该索引。只检查列 B 或 C 的 WHERE 子句不能使用索引。

标签: mysql database-indexes


【解决方案1】:

对一般问题的简短回答:视情况而定

长答案:

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

数据分布 如果前两列数据粒度较低(例如值列 A 代表性别,列 B 代表年龄),那么优化器很可能会更喜欢读取整个表而不是使用索引。 ** 在这种情况下,仅在 A、B 上添加索引也没有用**

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

【讨论】:

    【解决方案2】:

    看到这个答案: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 则单独搜索时不使用索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多