我有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)
之类的东西应该有用。但我发现无法创建这样的索引。
感谢任何帮助。谢谢!
答案 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)