【发布时间】:2022-01-09 06:13:31
【问题描述】:
我有一个包含很多行的表,我想加快查询速度。这是原始查询:
cursor.execute("""select id, data
from events
where processed IS NULL and instr(data, 'Captain') = 0;""")
我认为我可以通过首先仅选择未处理的行然后搜索 data 变量的文本来加快速度。但这也很慢。
cursor.execute("""select x.id, x.data
from
(select a.id, a.data from events as a where a.processed IS NULL) as x
where instr(x.data, 'Captain') = 0;""")
在搜索 data 之前,我有什么想法可以过滤已处理的列是否为 NULL?
【问题讨论】:
-
您可以使用的另一种方法是向数据列添加索引,并将
instr切换为like。这将使对数据列的过滤更快。另见:stackoverflow.com/questions/2451608/… -
但这也很慢 此外,它比初始变体慢 - 根本无法检测到这种差异。
-
@juergend OP 需要在不存在
'Captain'子字符串的行中。 -
如果表包含许多列,那么
(processed, data, id)的索引会有所帮助。如果带有processed IS NULL的行的百分比很低(5% 或更少),那么(processed)的索引会有所帮助(但您可能会强制使用它)。在另一些情况下,我看不到改进的方法。