查询要花费6秒钟以上才能获取400万条记录。可以执行任何其他过程以最小化查询时间。
SELECT title_id, count(title_id) as count
FROM `title_keywords`
WHERE keyword_id in (1,2,3,4,5,6,7,8,9)
GROUP BY title_id
ORDER BY count desc
索引和唯一列
答案 0 :(得分:1)
由于COUNT
函数需要潜在地触摸每个组中的每条记录,因此可能没有太多可以加快聚合的过程。但是,我们也许可以利用索引来加速WHERE
子句:
CREATE INDEX idx ON title_keywords (keyword_id, title_id);
您还可以尝试反转索引列的顺序,并且在两种情况下都可以使用EXPLAIN
检查执行计划。该索引可能起作用的原因是,它将允许MySQL快速访问匹配的keyword_id
记录。索引还覆盖title_id
,因此该值将在B树的叶子节点中可用。
答案 1 :(得分:0)
尝试使用INNER JOIN避免IN子句
SELECT title_id, count(title_id) as count
FROM title_keywords
INNER JOIN (
SELECT 1 col1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7
UNION
SELECT 8
UNION
SELECT 9
) t t.col1 = title_keywords.keyword_id
group by title_id
order by count desc
并确保您在
上有正确的索引表title_keywords列(keyword_id,title_id)
答案 2 :(得分:0)
您尝试过BETWEEN
吗?
WHERE keyword_id BETWEEN 1 AND 9
GROUP BY title_id
ORDER BY count DESC