跨两个表加速MYSQL内部联接查询

跨两个表加速MYSQL内部联接查询,mysql,sql,performance,select,join,Mysql,Sql,Performance,Select,Join,此查询的作用类似于搜索。不幸的是,查询当前运行时间为1.5到2秒,这是不可接受的。在对查询运行EXPLAIN之后,我看到它使用的是“usingtemporary;usingfilesort”,没有索引。但是,我不确定您可以将索引放在这个查询的何处 ORDER BY也会大大降低查询速度,但这是必需的。 对如何改进此查询有何建议 SELECT DISTINCT p.id, p.date, ( SELECT COUNT(post_id) FROM post_tags WHERE post_id =

此查询的作用类似于搜索。不幸的是,查询当前运行时间为1.5到2秒,这是不可接受的。在对查询运行EXPLAIN之后,我看到它使用的是“usingtemporary;usingfilesort”,没有索引。但是,我不确定您可以将索引放在这个查询的何处

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语句:

重写为:

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 ;
如果您在exlain中看到“Using temporary”,通常意味着您没有足够的内存来执行“order by”或其他操作

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

sort_buffer_size=128M

你也可以发布解释的完整输出。使用count(pt.post_id)和GROUP BY p.id和p.date不是更有效吗?首先,您可以删除子查询。@AdrianCornish我已将EXPLAIN语句添加到post中,并在此处:。@dash删除post_标记中的SELECT COUNT(post_id),其中post_id=pt.post_id将删除temp“t_COUNT”列上的排序,这对该查询非常重要。myisam还是innodb?如果使用mysiam,请阅读以下有关聚集索引的链接。你能为这一个添加解释吗?你查询的解释似乎和我原来的查询一样:你能添加表定义和你拥有的索引吗?
post\u tags.t\u id
有索引吗?@AdrianCornish这两个索引都已经设置好了。看起来大部分的缓慢是由订单造成的。