我有以下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
在posts
表中
{li} id_user, id_me
在followings
表中。
followings
表中的100K行,posts
表中的30K行。
我的问题是它需要超过1秒,是否可以编写这个需要几毫秒的查询?
答案 0 :(得分:0)
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 ...但这应该有所帮助......
答案 1 :(得分:0)
试试这个:
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
现在你没有在2个表之间进行交叉产品然后过滤它....现在你首先过滤大表(以下),所以它必须比连接更快。
答案 2 :(得分:0)
您的查询没有任何根本性的错误,您的索引也不远。
为了充分利用索引,不仅要了解将使用哪些列,而且要了解应该的最有效顺序,这一点很重要用于获取数据。
将following
上的索引替换为id_me, id_user
的索引(与您所描述的相反)。
那样MySql可以:
following
中查找正确的行,方法是查找索引的一小部分(这是减少所需工作量的最佳方法)id_user
上的索引中的following
数据,以便... posts
中找到正确的行。基本上尝试弄清楚你如何找到数据,然后提供索引来帮助MySql为你做。
答案 3 :(得分:-2)
如果添加索引是一个选项,请为id
添加一个(无论哪个表来自),因为它用于ORDER
。见http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/
通过向ORDER
子句添加索引,我对大型表的查询从30秒减少到3秒。
还建议让ORDER
列来自前导表。因此,如果id
来自posts
表,那么它已经是正确的,但如果没有,请反转查询中的表格,选择FROM followings
和JOIN posts
。
最后,如果id_user, id_me
是一个多列索引,将它更改为两个单独的索引可能很有用,因为它没有利用WHERE
子句中的索引。作为一个多列索引,假设您要查找的id
很少见,它仍然需要扫描表的大部分内容才能找到您请求的limit
。
正如其他人所提到的,将多列索引的顺序反转为id_me,id_user
会有所帮助,因为WHERE
子句以最快的速度缩小结果(同时假设您要查找的id
是很少见,但我不知道它是否仍会利用id_user
部分进行连接,尽管这会产生较小的影响。