【问题标题】:Why does this query slow down when using a subquery为什么使用子查询时此查询会变慢
【发布时间】:2021-10-12 15:29:34
【问题描述】:

我有一个包含 2 个表的 SQLite 数据库,其中一个引用另一个:

> create table commenters (
    id integer primary key autoincrement,
    <snip>
    displayName text not null,
    <snip>
);
> create table comments (
    id integer primary key autoincrement,
    <snip>
    commenterID text not null,
    <snip>
);

在 cmets 表中的 commenterID 上有一个索引:

> create index comments_commenter_id on comments (commenterID);

以下 2 个查询在单独运行时实际上是即时的:

> select id from commenters where displayName = "somename";
12345
> select * from comments where commenterID = 12345;
many results...

对我来说,将上述内容组合成子查询的以下查询应该同样快:

select * from comments where commenterID = (select id from commenters where displayName = "somename");

但是,该查询需要数十秒才能运行。这个带有连接的查询也很慢:

select comments.* 
from commenters left join comments 
on commenters.id = comments.commenterID
where commenters.displayName = "somename";

在我看来,数据库似乎没有将索引用于后面的查询,因为结果会慢慢流入。这是 SQLite 的一个已知怪癖吗?

【问题讨论】:

  • commenterID text。这应该是 integer 以匹配它所引用的 ID。
  • 天哪,我是个白痴。谢谢!

标签: sql performance sqlite


【解决方案1】:

Stu 指出的解决方案是将第二个表中的commenterID 更改为int 类型。

【讨论】:

    【解决方案2】:

    您需要displayName 的索引:

    create index idx_commenters_displayName on commenters(displayName);
    

    还有一个关于commenterid的索引:

    create index idx_comments_commenterid on comments(commenterid)
    

    =s 很好,但这更通俗地说是使用join

    select c.*
    from comments c join
         commenters cr
         on cr.id = c.commenterID
    where cr.displayName = 'somename';
    

    【讨论】:

    • 嗯,这似乎并没有加快速度。 commenters 是一个比comments 小得多的表。此外,如果displayName 是问题所在,这个查询肯定也会运行缓慢,但不会:select id from commenters where displayName = "somename";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多