2012-10-12 59 views
1
SELECT a.*, u.avatar, u.name, u.surname, u.username, COUNT(a.user1) AS cnt 
FROM user_actions a,users u,following f 
WHERE a.user1=u.user_id AND 
a.user1=f.follower_id AND 
f.user_id=159 
GROUP BY a.user1, a.action, day(a.dt) 
ORDER BY a.id DESC 
LIMIT 7; 

查詢花費4.4909秒如何優化我的mysql查詢?

指標的表user_actions:

Action Keyname  Type Unique Packed Column Cardinality Collation 
Edit PRIMARY  BTREE Yes No  id  516094  A   
Edit user1  BTREE No  No  user1  15639  A   
Edit user2  BTREE No  No  user2  36863  A   
Edit action  BTREE No  No  action 16   A   
Edit dt   BTREE No  No  dt  516094  A   
Edit group_index BTREE No  No  user1  20643  A   


EXPLAIN SELECT a . * , u.avatar, u.name, u.surname, u.username, COUNT(a.user1) AS cnt 
FROM user_actions a, users u, following f 
WHERE a.user1 = u.user_id 
AND a.user1 = f.follower_id 
AND f.user_id =159 
GROUP BY a.user1, a.action, day(a.dt) 
ORDER BY a.id DESC 
LIMIT 7 

ID SELECT_TYPE表型possible_keys鍵key_len REF行 額外1 SIMPLE F ref時USER_ID,follower_id,for_actions for_actions 4 const 242使用索引;使用臨時;使用文件排序1 SIMPLE 一個裁判USER1,GROUP_INDEX GROUP_INDEX 4 pictify_main.f.follower_id 25 1簡單U eq_ref PRIMARY PRIMARY 4 pictify_main.a.user1 1使用其中

+0

您可以嘗試在查詢之前添加EXPLAIN以獲取其詳細分析。比你可以在這裏發佈結果,所以我們將能夠看到什麼是錯的。 – magnetik

回答

0

無法理解烏爾因爲格式化的指標

但以下索引可以幫助..

user_actions(user1) 
following (user_id) 
users(user_id) 

別人的建議,請發表解釋計劃。

0

非確定性GROUP BY: 的SQL檢索既不在聚合函數,也不是GROUP BY表達式列,所以這些值將在結果非確定性。

SELECT *: 中選擇所有列與通配符*將導致查詢的含義和行爲,如果表的模式的變化而變化,並可能導致查詢檢索的數據太多。

混疊而不AS關鍵字 顯式使用在列或表別名AS關鍵字,例如「TBL AS別名」是比隱別名如「TBL別名」更具有可讀性。

0

我會扭轉它的一些,因爲你正在尋找一個特定的「跟隨」用戶ID ......然後添加「STRAIGHT_JOIN」的條款來告訴MySQL爲了做明確列出

確保爲 表索引的索引 繼(USER_ID,Follower_ID) 用戶(USER_ID) User_Actions(用戶1,動作,DT,ID)

select STRAIGHT_JOIN 
     UA.*, 
     U.Avatar, 
     U.Name, 
     U.SurName, 
     U.UserName, 
     count(*) as UserActionsCount 
    from 
     Following F 
     JOIN User_Actions UA 
      on F.Follower_ID = UA.User1 
      Join Users U 
       on UA.User1 = U.User_ID 
    where 
     F.User_ID = 159 
    group by 
     F.Follower_ID, 
     UA.Action, 
     Day(UA.Dt) 
    order by 
     UA.ID DESC 
    limit 
     7 
0

使用連接而不是逗號分隔FROM cluase:

SELECT a.*, u.avatar, u.name, u.surname, u.username, COUNT(a.user1) AS cnt 
FROM following f 
LEFT JOIN user_actions a ON a.user1 = f.follower_id 
LEFT JOIN users u ON u.user_id = a.user1 
WHERE f.user_id = 159 
GROUP BY a.user1, a.action, day(a.dt) 
ORDER BY a.id DESC 
LIMIT 7; 

我選擇使用FROM子句中的following表作爲搜索的關鍵部分基於following.user_id。這應該會減少獲取的行數,因爲您在早期儘可能縮小結果集的範圍。

我推薦LEFT JOIN,因爲這將返回following的行,即使它們不匹配其他兩個表中的任何條目,這通常是您希望在此類查詢中得到的結果。如果您只想要所有3個表中都有數據的行,請嘗試使用INNER JOIN