【发布时间】:2013-06-26 19:17:00
【问题描述】:
我正在尝试找出最好的方法,(在这种情况下可能无关紧要)根据标志的存在以及另一个表中的一行中的关系 id 来查找一个表的行.
这里是架构:
CREATE TABLE files (
id INTEGER PRIMARY KEY,
dirty INTEGER NOT NULL);
CREATE TABLE resume_points (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
scan_file_id INTEGER NOT NULL );
我正在使用 SQLite3
文件表会非常大,通常有 10K-5M 行。 resume_points 将很小 scan_file_id's
所以我的第一个想法是:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
一位同事建议扭转联接:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
然后我想,既然我们知道不同的scan_file_id 的数量会非常少,那么子选择可能是最佳的(在这种罕见的情况下):
select * from files where id in (select distinct scan_file_id from resume_points);
explain 输出具有以下行:分别为 42、42 和 48。
【问题讨论】:
-
这取决于您的数据和硬件。你必须自己衡量。
-
您错过了上次查询时的 files.dirty = 1
标签: sql database sqlite query-optimization