为什么我的 sqlite `update set` 花费太多时间?

Why does my sqlite `update set` take too much time?

我有两个 table,分别称为 productimage,如下所示:

CREATE TABLE "product" (
  "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
  "Image" TEXT
);
CREATE TABLE "image" (
  "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
  "IsCover" INTEGER,
  "Url" TEXT,
  "Product" INTEGER,
  FOREIGN KEY ("Product") REFERENCES "product" ("Id")
);

product table 包含大约 350,000 行,image table 包含超过 500,000 行。

我想将我的产品对应的图片传输到product.Image,所以我使用了这行代码但是它需要很长时间才能传输到运行。

update product
set image = (select Url from image
             where IsCover = 1 and
                   Product = product.Id
             limit 1);

有没有更快的方法来实现这个?为什么这种方式这么慢?

我首先要评论的是,在没有 ORDER BY 子句的情况下使用 LIMIT 1 通常没有多大意义。很明显,您希望在某些情况下子查询 return 多于一行。但是,最好的办法是使用其他逻辑修复子查询,以确保只会找到一个匹配项。

也就是说,要加快相关子查询的速度,您可以尝试以下两个索引建议之一:

CREATE INDEX idx1 ON image (Product, IsCover, Url);
or
CREATE INDEX idx2 ON image (IsCover, Product, Url);

由于子查询中的查找应该是迄今为止最大的性能瓶颈,添加正确的索引可能会大不相同。