我使用数据库来表示文件列表,以及与每个文件关联的一些元数据。我需要定期更新这个文件列表,只添加新文件并删除不再存在的文件(我没有触及表中的现有行,因为我会丢失相关的元数据)。
当我有大约10000个文件时,我当前的查询只需要几秒钟,但是使用我当前的150000文件表需要一个小时。
在互联网上进行一些研究之后,我一直在进行以下过程:
DELETE FROM files WHERE path NOT IN (SELECT path FROM newfiles);
INSERT INTO files (SELECT * FROM newfiles WHERE path NOT IN (SELECT path FROM files));
我也有索引:
CREATE INDEX "files_path" ON "files" ("path");
CREATE INDEX "files_path_like" ON "files" ("path" varchar_pattern_ops);
CREATE INDEX "files_path" ON "newfiles" ("path");
CREATE INDEX "files_path_like" ON "newfiles" ("path" varchar_pattern_ops);
(我主要使用这些索引在数据库中搜索;我的应用程序在文件中有搜索引擎。)
当我有150000个文件时,这两个查询中的每一个都需要一个多小时。 我该如何优化呢?
谢谢。
答案 0 :(得分:1)
尝试使用NOT EXISTS
代替NOT IN
,如:
DELETE FROM files WHERE NOT EXISTS
(SELECT 1 FROM newfiles WHERE newfiles.path=files.path);
此外,如果每次从头开始填充newfiles
,请确保在发出使用它的任何查询之前ANALYZE newfiles
,以便优化程序可以处理好的统计信息。
如果仍然无法解决问题,请在查询中尝试EXPLAIN
或EXPLAIN ANALYZE
以获得执行计划并将其附加到问题中。