【问题标题】:Optimize a SQL query with INDEX使用 INDEX 优化 SQL 查询
【发布时间】:2021-03-20 09:59:27
【问题描述】:

我有一个非常简单的查询

SELECT col1, col2, col3, col4 FROM table FORCE INDEX (col2)
WHERE col2 IN ('there', 'are, 'around', 'six', 'values', 'here')

索引 col2 用于 col2。我的table 有大约 1000 万行。我在这里使用了FORCE INDEX,因为我的表中有其他索引,而MySQL 使用其他索引之一而不是索引col2。此查询的另一个索引非常慢。

我的表中所有索引的列表:

INDEX col2 (col2)
UNIQUE INDEX ind1 (col1, col2)
INDEX ind2 (col1, col2)
INDEX ind3 (col2, col1)

此查询(使用FORCE INDEX)并不慢(在 AWS RDS 免费套餐上需要 6 秒),但需要使其尽可能快。我还能做些什么来加快这个查询的速度吗?

【问题讨论】:

  • 除非查询优化器出错,否则不应强制索引。有时使用索引会比较慢。
  • 编辑了帖子
  • 查询很简单。 MySQL 应该能够找出正确的索引。其他索引是什么,架构是什么,真正的查询是什么?
  • 我可以想象常量和表中的默认排序规则不同,阻止使用col2上的索引。
  • 编辑了帖子

标签: mysql sql


【解决方案1】:

首先,您应该尝试col2 上强制索引,而只需查看说明计划。这里很可能会使用col2 上的单列索引。但是,您可以尝试在表中添加以下复合覆盖索引:

CREATE INDEX idx ON yourTable (col2, col1, col3, col4);

该索引将涵盖WHERE 子句,还包括出现在SELECT 子句中的其他列。如果选择,MySQL 可以使用该索引来完全覆盖整个查询,而无需回溯到聚集索引(即原始表)。

【讨论】:

  • 我尝试省略 FORCE INDEX 但查询变得非常慢(MySQL 使用另一个索引)。我没有你在这里陈述的索引。你认为这个索引有可能比索引col2 更快吗?
  • 我很好奇这个其他索引是什么。我在上面建议的索引应该是最适合您的“最佳”选项。
【解决方案2】:
INDEX col2 (col2)
UNIQUE INDEX ind1 (col1, col2)
INDEX ind2 (col1, col2)
INDEX ind3 (col2, col1)

其中一些索引是多余的。 MySQL 可以使用(col2, col1) 搜索col2 以及col2col1。而ind2ind1 完全冗余。

冗余可能会使优化器感到困惑。

要覆盖col1col2 的所有组合,并强制执行唯一性,您只需要...

INDEX col2 (col2)
UNIQUE INDEX ind1 (col1, col2)

删除冗余索引将加快插入速度并节省空间。

8.3.6 Multiple-Column Indexes


query planner makes its guesses based on table statistics。有时这些统计数据已经过时了。尝试运行 analyze table 来更新它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2014-02-04
    相关资源
    最近更新 更多