从一个小表和一个大表优化选择查询

时间:2013-01-01 13:40:37

标签: php mysql sql

我使用PHP,MySQL用于以下
我有两张桌子

  1. 用户
  2. users_messages
  3. 表“users”存储所有用户的记录。

    id  name  password
    1   XYZ   XYZ
    

    [这里的id实际上是user_id]

    表“messages”包含用户发布的消息

    id  user_id messages
    1   1       XYZ
    

    “用户”表包含数千条记录(> 5000)
    “users_messages”包含大约100条记录(将保持不变)

    我正在尝试获取所有用户的消息并将其显示在表中。 目前我正在尝试对它们进行分页,因此我只需要一个页面加载20个用户。

    我的查询如下

    SELECT u.username as username,u.id as id, COUNT( f.user_id ) AS no_of_messages 
    FROM users AS u
    LEFT JOIN users_messages AS f ON f.user_id = u.id
    GROUP BY u.id LIMIT 20
    

    这有效,但需要很长时间......可能会扫描完整的表只是为了得到只有20个用户的消息。

    表“users”的id列不是从1开始,开始是随机的,但它会从下一条记录自动递增。

1 个答案:

答案 0 :(得分:0)

  

表“users”的id列不是从1开始,开头是   随机

请改为尝试:

SELECT 
  u.username as username, 
  u.id as id, 
  f.no_of_messages 
FROM users AS u
LEFT JOIN
(
   SELECT user_id, COUNT(*) no_of_messages 
   FROM users_messages
   GROUP BY user_id
) AS f ON f.user_id = u.id
ORDER BY u.id
LIMIT 20;