2016-12-10 132 views
1

如何增加这个MySQL查询的性能如何优化MySQL查询

SELECT ''           AS sharedid, 
     hubber_posts.userID       AS postowner, 
     hubber_posts.*, 
     ''           AS sharedby, 
     hubber_posts.userID       AS userID, 
     hubber_posts.posted_date      AS DATE, 
     ''           AS sharebyusr, 
     ''           AS sharebyusrimg, 
     Concat_ws(' ', firstname, lastname)   AS fullname, 
     username          AS postedBy, 
     hubber_user.image, 
     hubber_user.gender       AS gender, 
     (SELECT accounttype 
     FROM hubber_user_security us 
     WHERE hubber_user.ID = us.userID 
       AND hubber_posts.userID = us.userID) AS accounttype, 
     ''           AS sharebyusrtype 
FROM hubber_posts 
     INNER JOIN hubber_user 
       ON hubber_posts.userID = hubber_user.ID 
WHERE hubber_posts.status = 1 
+2

请尽量把一些精力来格式化T他查询。 –

+4

我投票结束这个问题作为题外话,因为性能问题应该包括EXPLAIN ANALYZE和关于表格大小,索引,当前时间表现,欲望时间等的一些信息。慢是一个相对术语,我们需要一个真正的价值来比较。 MySQL也请阅读[如何 - 问](http://stackoverflow.com/help/how-to-ask) – e4c5

+0

你需要阅读这个建议提出一个问题,我们可以回答。 http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056#271056 –

回答

0

我的建议是为支持加入其中hubber_posts是在基台和2个其他表可以使用嵌套循环连接。

  • 无需为连接索引hubber_posts。
  • hubber_user.ID应该是PK。
  • hubber_user_security.userID应被索引(并定义为FK引用hubber_user.ID)。

至于WHERE子句 - 只有当你有相对较少的行,其中hubber_posts.status = 1,那么你应该在hubber_posts.status

附:添加一个索引

自加入含有条件 -

ON hubber_posts.userID = hubber_user.ID 

没有必要既hubber_posts.userIDhubber_user.ID比较us.userID

0

你的示例代码,相关子查询。 MySQL的表现不佳,截至2016年底。

尝试将其转换为JOINed表。

SELECT all that stuff, 
      us.accounttype 
    FROM hubber_posts 
    JOIN hubber_user ON hubber_posts.userID = hubber_user.ID 
    LEFT JOIN hubber_user_security us ON hubber_user.ID = us.userID 
    WHERE hubber_posts.status = 1 

我用LEFT JOIN。如果没有LEFT,那么表中没有匹配条目的任何行将被从结果集中取消。

0

您的查询基本上是这样的:

SELECT . . . 
     (SELECT accounttype 
     FROM hubber_user_security us 
     WHERE u.ID = us.userID AND 
       p.userID = us.userID 
     ) AS accounttype, 
     . . . 
FROM hubber_posts p INNER JOIN 
    hubber_user u 
    ON p.userID = u.ID 
WHERE p.status = 1 ; 

对于此查询,最佳指标是:

  • hubber_posts(status, userId)
  • hubber_user(Id)
  • hubber_user_security(userId)

我会注意到,子查询有一个额外的相关条件,这是不必要的 - 用户ID已经相等。而且,如果存在多个帐户类型,则可能会发生错误。

你可能打算:

(SELECT GROUP_CONCAT(accounttype) 
    FROM hubber_user_security us 
    WHERE u.ID = us.userID 
    ) as accounttypes,