【问题标题】:Mysql - how to design indexes for a query with WHERE and GROUP BYMysql - 如何使用 WHERE 和 GROUP BY 为查询设计索引
【发布时间】:2020-10-29 15:46:31
【问题描述】:

我使用 MySQL (MyISAM) 数据库。

我有一个这样的查询:

select c1, c2, c3, MAX(c5) from T where c4=#string_value# group by c1, c2, c3

- c[1-4] are varchar(255)
- c5 is an integer

我尝试了两个索引:

  • "c1_c2_c3_idx" for (c1, c2, c3) - 使查询工作慢 3 倍
  • "c4_idx" for (c4) - 使查询工作速度提高 5 倍

也许有办法创建更快的索引?

【问题讨论】:

  • 你为什么使用 MyISAM?

标签: mysql


【解决方案1】:

最好的索引应该基于where条件...

 create index  idx1 on T ( c4) 

为了避免访问数据表并仅使用索引中包含的信息,您还可以尝试使用冗余索引添加其他子句中涉及的列

create index  idx1 on T ( c4, c1,c2,c3,c5) 

离开最左边的where列

【讨论】:

    【解决方案2】:

    我发现以下索引是最佳的:

    CREATE INDEX idx ON T (c4, c1, c2, c3, c5);
    

    索引以c4 开头,出现在WHERE 子句中,这是查询执行的第一部分。接下来,我们添加c1c2c3,以覆盖GROUP BY 子句。在此之后,我们添加c5,这将使MySQL 更快地找到MAX(c5)

    注意,上面的索引可以说覆盖整个查询,因为MySQL可以单独使用索引来满足整个查询计划,而不需要回溯到聚集索引(表) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多