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