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秒かかりました

テーブル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 

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra 1 SIMPLE f ref user_id、follower_id、for_actions for_actions 4const242インデックスの使用。一時的な使用; filesortの使用1SIMPLEa ref user1、group_index group_index 4 pictify_main.f.follower_id 25 1 SIMPLE u eq_ref PRIMARY PRIMARY 4pictify_main.a.user11ここでの使用

4

4 に答える 4

0

フォーマットが原因でurインデックスを理解できません

ただし、次のインデックスが役立ちます。

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

それ以外の場合は、説明プランを投稿してください。

于 2012-10-12T11:52:12.003 に答える
0

特定の「次の」ユーザーIDを探しているので、逆にします...次に、「STRAIGHT_JOIN」の句を追加して、明示的にリストされている順序で実行するようにMySQLに指示します

テーブルインデックスフォローイング(User_ID、Follower_ID)ユーザー(User_ID)User_Actions(User1、Action、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
于 2012-10-12T13:01:37.243 に答える
0

非決定的 GROUP BY: SQL は、集計関数にも GROUP BY 式にも含まれていない列を取得するため、これらの値は結果で非決定的になります。

SELECT *: * ワイルドカードを使用してすべての列を選択すると、テーブルのスキーマが変更された場合にクエリの意味と動作が変化し、クエリが大量のデータを取得する可能性があります。

AS キーワードを使用しないエイリアス 「tbl AS エイリアス」などの列またはテーブルのエイリアスで AS キーワード を明示的に使用すると、「tbl エイリアス」などの暗黙的なエイリアスよりも読みやすくなります。

于 2012-10-12T12:37:57.450 に答える