2016-12-10 129 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,