我有一个SQL查询,如下:
.env.local
表D包含5000万条记录,A包含3000万条记录,B&C分别包含30k条记录。索引是在联接,分组依据,排序依据中使用的所有列上定义的。
查询工作正常,无需使用order by语句,并在2-3秒左右的时间内返回结果。
但是,通过排序操作(排序依据),查询时间将增加到10-12秒。
我了解这背后的原因,执行者必须遍历所有记录以进行排序操作,而索引在这里几乎无济于事。
还有其他加快查询速度的方法吗?
这是此查询的解释分析:
SELECT
title,
(COUNT(DISTINCT A.id)) AS "count_title"
FROM
B
INNER JOIN D ON B.app = D.app
INNER JOIN A ON D.number = A.number
INNER JOIN C ON A.id = C.id
GROUP BY C.title
ORDER BY count_title DESC
LIMIT 10
;
答案 0 :(得分:1)
您可以尝试在def display_btn(self):
...
for value in data.values():
if value['delta'] is not None:
print(f"action={value['action']}, delta={value['delta']}, grace={value['delay']}")
streak_button = StreakButton(id=(value['action']), text=value['action'],
color=(0,0,0,1), size=(400, 50),
size_hint=(None, None))
self.root.screen_two.ids.streak_zone.add_widget(streak_button)
...
和b
之间建立嵌套循环联接,因为d
很小:
b
如果CREATE INDEX ON d (app);
清理得足够频繁,则可以看到仅索引扫描是否更快。为此,在索引中包含d
(在v11中,为此使用number
子句!)。 INCLUDE
的输出表明您对EXPLAIN
有额外的条件;您还必须为仅索引扫描也包括该列。