我有下面的mysql查询
SELECT p. *
FROM posts AS p
INNER JOIN followings AS f ON p.id_user = f.id_user
WHERE
f.id_me =(my id)
ORDER BY id LIMIT 11我有以下索引:
id_user表中的postsid_user, id_me在followings表中。followings表中的100 k行,posts表中的30K行。
我的问题是,它需要超过1秒,是否有可能写这个查询,需要几毫秒?
发布于 2014-02-18 18:00:41
SELECT p. *
FROM posts AS p
INNER JOIN (SELECT id_me, id_user from followings order by id_me, id_user) AS f ON p.id_user = f.id_user
WHERE
f.id_me =(my id)
ORDER BY id LIMIT 11 通过创建一个sub_query,您将索引放在ID上,而不更改表。这应该会加快时间。如果这不起作用,而且它对这个查询使用了不正确的索引,那么您可以使用force_index...but --这会有一点帮助.
发布于 2014-02-18 18:06:42
试试这个:
select p. *
from posts p
where p.id_user in
(select f.id_user
from
followings f
where
f.id_me =(my id) )
order by id limit 11现在,您不需要在两个表之间执行交叉积,然后过滤it....now,首先过滤大表(如下所示),所以它必须比联接更快。
发布于 2014-02-18 18:11:23
查询没有根本问题,索引也不远。
为了最大限度地利用索引,不仅要了解将使用哪些列,而且要了解最有效的顺序,以便将数据从哪些列中提取出来。
将following上的索引替换为id_me, id_user (与您描述的相反)。
这样,MySql就可以:
following中查找合适的行,方法是查找索引的一小部分(这是减少需要完成的工作量的最佳方法)。id_user数据在following上的索引,以便.posts中找到正确的行。基本上,试着找出如何找到数据,然后提供索引来帮助MySql为您做这件事。
https://stackoverflow.com/questions/21861687
复制相似问题