我想找出最好的方法,(可能無所謂在這種情況下)找到一個表的行,基於一個標誌的存在和關係的ID在另一個表中連續排列。SQLite3查詢優化連接vs子查詢
這裏的模式:
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將小< 10K只用1-2個不同scan_file_id
的
所以我的第一個想法是:
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 – eglasius