在mysql中优化连接表视图的索引

时间:2018-05-07 06:41:45

标签: mysql sql query-optimization

我在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上创建分区,但在性能方面没有太大帮助。

1 个答案:

答案 0 :(得分: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返回大量行,则聚合将花费时间。可能无法在此查询上获得亚秒级性能。您可能需要使用带触发器的摘要表来更新值。