我想知道您是否有一些改进此查询的提示:
select id, name, friends_count, post_count, from user where id in
(select distinct(id) from friends where id in
(24,245,888,765,907,203,3,972)) order by friends_count desc limit
0,10;
解释输出是:
+----+--------------------+----------+-------+---------------+---------+---------+------+--------+-------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+----------+-------+---------------+---------+---------+------+--------+-------------------------------------------+
| 1 | PRIMARY | user | ALL | NULL | NULL | NULL | NULL | 451302 | Using where; Using filesort |
| 2 | DEPENDENT SUBQUERY | friends | range | PRIMARY | PRIMARY | 8 | NULL | 395816 | Using where; Using index; Using temporary |
+----+--------------------+----------+-------+---------------+---------+---------+------+--------+-------------------------------------------+
用户表的索引是id行中的主键。对于朋友,有一个主键表单id和friend_id。
用户表有大约587445个结果,朋友有572515(都在增长)。
当前查询花了超过20分钟。
从属子查询提供大约220.000个结果,因此主查询在where clausule中有超过220k的id。
你有一些提示(索引或类似的东西)来改善这个吗?
谢谢和最诚挚的问候。
答案 0 :(得分:1)
这样的东西?
select
id,
name,
friends_count,
post_count,
from
user u
where
u.id in (4,245,888,765,907,203,3,972)
order by
friends_count desc
limit 0,10;
你永远不应该在where子句中进行嵌套选择。您应该尽可能利用连接。如果你不这样做,每次比较都需要选择一个性能极高的数据库。
我更正了我的查询。看起来像friend_id和user_id是一样的。如果你让我知道列应该是什么,我可以更新它。