加速两个表的MYSQL内部连接查询

时间:2012-01-25 00:17:39

标签: mysql sql performance select join

此查询的目的是像搜索一样行事。不幸的是,查询当前运行时间为1.5到2秒,这是不可接受的。在查询上运行EXPLAIN后,我看到它正在使用“使用临时;使用filesort”而没有索引。但是,我不确定在哪里可以为此查询添加索引。

ORDER BY也会慢慢减慢查询速度但是需要它。 有关如何改进此查询的任何建议吗?

SELECT DISTINCT p.id, p.date,
(
  SELECT COUNT(post_id) FROM post_tags WHERE post_id = pt.post_id
) as t_count 
FROM post_tags pt 
INNER JOIN posts p 
  ON (pt.post_id = p.id) 
WHERE pt.t_id IN (7,456)
ORDER BY t_count, p.s_count DESC, p.id DESC 
LIMIT 0, 50;

以下是EXPAIN声明:https://gist.github.com/e742982e435cf082c033

2 个答案:

答案 0 :(得分:0)

重写为:

SELECT p.id
     , p.date
     , COUNT(*) AS t_count 
FROM posts p
  INNER JOIN post_tags pts 
    ON pts.post_id = p.id
WHERE EXISTS
      ( SELECT *
        FROM post_tags pt
        WHERE pt.post_id = p.id
          AND pt.t_id IN (7,456)
      )
GROUP BY p.id
ORDER BY t_count, p.s_count DESC, p.id DESC 
LIMIT 0, 50 ;

答案 1 :(得分:0)

如果您看到“使用临时”;在你的遗嘱中,这通常意味着你没有为你的“命令”或其他操作留下记忆。

对于这个查询,我认为你的my.conf增加了

sort_buffer_size=128M