Php 从一个小表和一个大表优化select查询

Php 从一个小表和一个大表优化select查询,php,mysql,sql,Php,Mysql,Sql,我正在使用PHP、MySQL进行以下操作 我有两张桌子 使用者 用户信息 表“users”存储所有用户的记录 id name password 1 XYZ XYZ 这是可行的,但需要很长时间。。。可能它扫描整个表只是为了得到只有20个用户的消息数量 表“users”的id列不是从1开始的,它是随机的,但它会从下一条记录自动递增 表“users”的id列不是从1开始的,而是从 随机的 请尝试以下方法: SELECT u.username as username, u.id

我正在使用PHP、MySQL进行以下操作
我有两张桌子

  • 使用者
  • 用户信息
  • 表“users”存储所有用户的记录

    id name password 1 XYZ XYZ 这是可行的,但需要很长时间。。。可能它扫描整个表只是为了得到只有20个用户的消息数量

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

    表“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;
    

    查看是否在用户表上启用了索引。介意将
    explain users
    的输出摆成姿势吗?使用use
    distinct u.username
    having count(u.id)=20
    如何?他正在寻找
    LIMIT 20
    作为分页,而不是
    having
    子句,是的,它可能需要使用'distinct'。
    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
    
    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;