为什么我的sqlite`update set`需要太多时间?

问题描述

我有两个名为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表包含约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);

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...