为什么我的 sqlite `update set` 花费太多时间?
Why does my sqlite `update set` take too much time?
我有两个 table,分别称为 product
和 image
,如下所示:
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);
由于子查询中的查找应该是迄今为止最大的性能瓶颈,添加正确的索引可能会大不相同。
我有两个 table,分别称为 product
和 image
,如下所示:
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);
由于子查询中的查找应该是迄今为止最大的性能瓶颈,添加正确的索引可能会大不相同。