【问题标题】:Optimizing index on view of joined table in mysql优化mysql中连接表视图的索引
【发布时间】:2018-05-07 06:41:44
【问题描述】:

我有 2 个表的连接查询:

table1 架构

| k | m | y | s | c | h |

table2 架构

| k | l | h |

这是我的 mysql 查询:

SELECT l,m,y,sum(s)
FROM table1 t1
JOIN table2 t2
on t1.h=t2.h
WHERE t1.c = 405 
AND t2.l in (500)
GROUP BY m,y,l;

table1 有超过 1.3 亿行,table2 有 100 万行。我在这样的 2 个表上创建了索引:

CREATE  INDEX idx_temp1 ON table1(h,c);
CREATE  INDEX idx_temp2 ON table2(h,l);

查询仍然需要很长时间(超过 10 分钟)。我的用例希望查询在一秒钟内执行。请告诉我是否可以对查询进行任何优化。

PS:我也尝试在 c 上创建分区,但在性能方面没有太大帮助。

【问题讨论】:

  • 为你的 SQL 添加解释计划。
  • 你能提供一个表模式吗?
  • 只需删除您创建的索引并创建两个新索引:在表 1 中的 c 列和表 2 中的 l 列上
  • @Jack 我已经添加了
  • @maxim 但它不会影响 'h' 上 2 个表的连接吗?

标签: mysql sql query-optimization


【解决方案1】:

对于这个查询:

SELECT t2.l, t1.m, t1.y, sum(t1.s)
FROM table1 t1 JOIN
     table2 t2
     ON t1.h = t2.h
WHERE t1.c = 405 AND t2.l in (500)
GROUP BY t2.l, t1.m, t1.y;

我会建议两种索引策略。假设t1 上的条件是最严格的,那么试试table1(c, h, m, y, s)table2(h, l)

如果 t2 的限制更严格,那么 table2(l, h)table1(h, c, m, y, s)

请注意,如果JOIN 返回大量行,则聚合将需要时间。可能无法在此查询上获得亚秒级的性能。您可能需要借助带有触发器的汇总表来更新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多