【问题标题】:MySQL Subquery From the Same Table来自同一个表的 MySQL 子查询
【发布时间】: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) 的索引会有所帮助(但您可能会强制使用它)。在另一些情况下,我看不到改进的方法。

标签: python mysql sql


【解决方案1】:

也许instr(data, 'Captain') 可以更改为data NOT LIKE '%Captain%'?任何一种公式都必须读取每一行,所以我怀疑是否会有速度差异。

同时考虑FULLTEXT(data)NOT MATCH(data) AGAINST('+Captain' IN BOOLEAN MODE)FULLTEXT 可能因为 NOT 而无济于事。

至于您对子查询的想法,我认为这无济于事。毕竟这基本上就是正在发生的事情。

可能重要的是您拥有的索引和它们的基数。如果processed很少NULL(例如,不到 10% 的行),那么 INDEX(processed) 会加快速度。

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2021-02-03
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多