按时间排序并按顺序排序

时间:2019-05-04 15:47:16

标签: mysql sql

查询要花费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

索引和唯一列

See the index of table on picture

也添加了综合索引added composite index

3 个答案:

答案 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