我有两个名为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
表包含大约350000行,image
表包含超过500000行。
我想将与我的产品对应的图像传输到product.Image
,所以我使用了这行代码,但它需要很长时间才能运行。
update product
set image = (select Url from image
where IsCover = 1 and
Product = product.Id
limit 1);
有没有更快的方法来实现这一点?为什么这么慢?
我首先要评论的是,在没有ORDER BY
子句的情况下使用LIMIT 1
通常没有多大意义。很明显,在某些情况下,子查询会返回多行。但是,最好的方法是使用其他逻辑修复子查询,以确保只找到一个匹配项。
也就是说,为了加快相关子查询的速度,您可以尝试以下两个索引建议之一:
CREATE INDEX idx1 ON image (Product, IsCover, Url);
or
CREATE INDEX idx2 ON image (IsCover, Product, Url);
由于子查询中的查找应该是迄今为止最大的性能瓶颈,因此添加正确的索引可能会带来很大的不同。