我该如何优化此查询? 02

时间:2014-04-23 14:33:55

标签: mysql

我想知道您是否有一些改进此查询的提示:

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。

你有一些提示(索引或类似的东西)来改善这个吗?

谢谢和最诚挚的问候。

1 个答案:

答案 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是一样的。如果你让我知道列应该是什么,我可以更新它。