如何提高MySQL INNER JOIN的性能?

时间:2014-02-18 17:55:56

标签: php mysql sql

我有以下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

我有以下索引:

    {li} id_userposts表中 {li} id_user, id_mefollowings表中。

followings表中的100K行,posts表中的30K行。

我的问题是它需要超过1秒,是否可以编写这个需要几毫秒的查询?

4 个答案:

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

最后,如果id_user, id_me是一个多列索引,将它更改为两个单独的索引可能很有用,因为它没有利用WHERE子句中的索引。作为一个多列索引,假设您要查找的id很少见,它仍然需要扫描表的大部分内容才能找到您请求的limit。 正如其他人所提到的,将多列索引的顺序反转为id_me,id_user会有所帮助,因为WHERE子句以最快的速度缩小结果(同时假设您要查找的id是很少见,但我不知道它是否仍会利用id_user部分进行连接,尽管这会产生较小的影响。