【问题标题】:Is it good to add Group By and Order By columns in Index for MySQL在 Index for MySQL 中添加 Group By 和 Order By 列是否很好
【发布时间】:2020-01-18 12:57:03
【问题描述】:

我在查询的 Where 子句中的列上有复合索引,但我应该在索引中添加 Group By 和 Order By 列吗?

例如我有一个查询:

select c1, c2
from table t1
where c3 = "A"
and c4 = "B"
Group By c1
Order By c5

我当前的索引在 c3 和 c4 上(与查询的顺序相同)。是否应该在索引中添加 c1 和 c4 以提高查询性能?

【问题讨论】:

  • 查询(有点)荒谬,这也使问题变得荒谬。一个好的经验法则是“如果你没有任何聚合函数,那么你就不需要 GROUP BY 子句”。如果您只想返回 DISTINCT 结果,请使用 DISTINCT。
  • 很难用这么少的上下文回答这个问题,但作为一般建议,我建议使用 EXPLAIN 来确定哪些索引用于给定查询:dev.mysql.com/doc/refman/5.7/en/explain.html
  • 大概学习如何使用GROUP BY。如果没有任何聚合,它就毫无用处。
  • 正如草莓所说,您的假设查询是不切实际的。此外,由于 Order By 子句中使用的非聚合和非选择字段,它将无效并引发错误。无论如何,如果您正在寻找一些关于索引的提示,您可以阅读以下内容:mysql.rjweb.org/doc.php/index_cookbook_mysql
  • 示例查询有点好笑,但我认为这里真正的问题是mysql是否使用索引来优化group by/order by?按方面的顺序在这里回答dba.stackexchange.com/questions/11031/…

标签: mysql indexing


【解决方案1】:

视情况而定。

where c3 = "A"
  and c4 = "B"
Group By c1
Order By c5

可以使用以下任何一种:

INDEX(c3, c4, c1)
INDEX(c4, c3, c1)

无法通过GROUP BY 到达ORDER BY(除非它们相同)。

另一方面,这更难优化:

where c3 > "A"   -- note the inequality (a "range")
  and c4 = "B"
Group By c1
Order By c5

这是最好的:

INDEX(c4, c3)   -- the order matters now: '=' first

进一步:

where c3 = "A"
  and c4 = "B"
Group By c1
Order By c1     -- same as GROUP BY
LIMIT 10        -- now can get to this

如果你有,这将在 10 行后停止

INDEX(c3, c4, c1) or INDEX(c4, c3, c1)

在其他示例中添加LIMIT:他们会找到所有行,对它们进行排序,然后交付 10 个。

更多关于最优复合索引的讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

要使索引“覆盖”,请添加(最后)查询中的任何其他列。 (但不要因此而得意忘形。经验法则:不要创建超过 5 列的索引。)“覆盖”额外提高了速度,因为查询可以完全在索引的 BTree 中执行.

【讨论】:

    【解决方案2】:

    考虑以下几点:

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (id SERIAL PRIMARY KEY
    ,c1 INT NOT NULL
    ,c2 CHAR(1) NOT NULL
    );
    
    SELECT DISTINCT c1
               FROM my_table t1
              WHERE c2 = 'A'
    

    此查询将受益于 (c2,c1) 上的覆盖索引。

    请注意,这很容易测试 - 不过,奇怪的是,如果您同时提供索引 (c1,c2) 和 (c2,c1),它似乎选择了错误的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多