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
id select_type表类型possible_keys键key_len ref行 额外1 SIMPLE f ref user_id,follower_id,for_actions for_actions 4 const 242使用索引;使用临时;使用filesort 1 SIMPLE ref user1,group_index group_index 4 pictify_main.f.follower_id 25 1 SIMPLE u eq_ref PRIMARY PRIMARY 4 pictify_main.a.user1 1使用
答案 0 :(得分:0)
由于格式化无法理解你的索引
但是以下索引可以帮助..
user_actions(user1)
following (user_id)
users(user_id)
除非建议,请发布解释计划。
答案 1 :(得分:0)
非确定性GROUP BY: SQL检索既不在聚合函数中也不在GROUP BY表达式中的列,因此这些值在结果中将是不确定的。
SELECT *: 使用*通配符选择所有列将导致查询的含义和行为在表的架构更改时发生更改,并可能导致查询检索过多数据。
没有AS关键字的别名 在列或表别名中明确使用AS关键字(例如“tbl AS别名”)比隐式别名(如“tbl alias”)更具可读性。
答案 2 :(得分: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
答案 3 :(得分: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;
我选择使用following
子句中的FROM
表,因为搜索的关键部分基于following.user_id
。这应该会减少在早期尽可能缩小结果集时获取的行数。
我建议使用LEFT JOIN
因为这会返回following
中的行,即使它们与其他两个表中的任何条目都不匹配,这通常是您在此类中需要的结果查询。如果您只想要在所有3个表中包含数据的行,请尝试使用INNER JOIN
。