这个sql怎么优化呢

explain SELECT

m.status_change_time,
m.status_statistic,
m.uid,
m.is_perfect,
m.nickname,
m.idcard,
m.sex,
m.reg_time,
m. STATUS,
s.uid AS uu,
s.resp_id,
s.fuwuleibie,
s.id AS sid,
s.note,
s.add_time sign_time

FROM

es_members AS m

LEFT JOIN es_member AS m2 ON m2.uid = s.resp_id
LEFT JOIN es_dynamic_reflection AS d ON m.uid = d.uid
LEFT JOIN es_sign AS s ON s.uid = m.uid
WHERE

m.`is_registration` = 0

AND m.status >= 0
AND FIND_IN_SET(3, dr_key)
AND FIND_IN_SET(13, fuwuleibie)
AND m.huji = '2'
AND 1
AND (s.resp_id > 0)
AND (s.fuwubaoleixing = 2)
GROUP BY

m.uid

ORDER BY

m.reg_time DESC

LIMIT 0,
10

发现有一张表全表扫描了,无法用到索引,这个表是会员表 数据量10w,有时候打开都要几秒

clipboard.png

阅读 2.5k
3 个回答

如果可以的话,请贴一下表结构

1、d和m2表在SELECT的字段清单中和WHERE的过滤条件中未使用,是否能取消关联?
2、尽早使用LIMIT条件,建议把表m和表s先关联查询(有LIMT条件),然后再关联其他表,如:

SELECT *
FROM (
    SELECT *
    FROM     es_members AS m
        LEFT JOIN es_sign AS s ON s.uid = m.uid
    LIMIT 0, 10
) ms 
    LEFT JOIN es_member AS m2 ON m2.uid = s.resp_id
    LEFT JOIN es_dynamic_reflection AS d ON m.uid = d.uid

1、如果里面有相关的信息用不到就将多余的字段选择去掉,若是信息都用到避免不了都要找全表,昨天我们也在项目里发现同样的问题,我们只需要用到查找用户名,但是写了无用的信息差找全表,一万多条数据就把项目卡住了,这里我们只需要查用户名就行了,其他信息可以取消的就取消。
2、关联的表用不到就把关联的取消,像楼上说的尽早使用limit也是极好的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题