我在2个表上有一个连接查询:
| k | m | y | s | c | h |
| k | l | h |
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上创建分区,但在性能方面没有太大帮助。
答案 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
返回大量行,则聚合将花费时间。可能无法在此查询上获得亚秒级性能。您可能需要使用带触发器的摘要表来更新值。