索引跨越多个表的列

时间:2014-06-11 03:29:34

标签: sqlite indexing

我有2个表,headers有2百万行,files有30行。

我有一个查询,假设获取每个目录的标题总数。

SQL如下所示:

SELECT files.dir_id, COUNT(*) AS "TOTAL"
FROM headers
LEFT JOIN files ON headers.file_id = files.file_id
GROUP BY files.dir_id

目前,执行上述SQL需要20秒。如何对其进行索引以使其更快?

我试过了CREATE INDEX IF NOT EXISTS HEADERS_FILE ON HEADERS(FILE_ID)。这使GROUP BY file_id得到即时响应(没有左连接文件表)。但是,它并没有改善上述原始查询的性能。

我想CREATE INDEX INDEX_NAME ON HEADERS, FILES(FILE_ID, DIR_ID)之类的东西应该有用。但我发现无法创建这样的索引。

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

LEFT联接阻止数据库使用files作为嵌套循环连接中的外表。

尝试使用内连接,然后手动添加缺少的行;这可能允许更好地优化两个子查询:

SELECT files.dir_id, COUNT(*) AS "TOTAL"
FROM headers
-- LEFT JOIN expanded by hand for better optimization
INNER JOIN files ON headers.file_id = files.file_id
GROUP BY files.dir_id
UNION ALL
SELECT dir_id, 0
FROM files
WHERE file_id NOT IN (SELECT file_id
                      FROM headers)