鍍金池/ 問答/數(shù)據(jù)庫/ 這個sql怎么優(yōu)化呢

這個sql怎么優(yōu)化呢

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

發(fā)現(xiàn)有一張表全表掃描了,無法用到索引,這個表是會員表 數(shù)據(jù)量10w,有時候打開都要幾秒

clipboard.png

回答
編輯回答
深記你

1、d和m2表在SELECT的字段清單中和WHERE的過濾條件中未使用,是否能取消關(guān)聯(lián)?
2、盡早使用LIMIT條件,建議把表m和表s先關(guān)聯(lián)查詢(有LIMT條件),然后再關(guān)聯(lián)其他表,如:

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
2018年2月19日 23:33
編輯回答
薄荷糖

1、如果里面有相關(guān)的信息用不到就將多余的字段選擇去掉,若是信息都用到避免不了都要找全表,昨天我們也在項(xiàng)目里發(fā)現(xiàn)同樣的問題,我們只需要用到查找用戶名,但是寫了無用的信息差找全表,一萬多條數(shù)據(jù)就把項(xiàng)目卡住了,這里我們只需要查用戶名就行了,其他信息可以取消的就取消。
2、關(guān)聯(lián)的表用不到就把關(guān)聯(lián)的取消,像樓上說的盡早使用limit也是極好的

2018年6月12日 14:25
編輯回答
檸檬藍(lán)

如果可以的話,請貼一下表結(jié)構(gòu)

2017年12月6日 17:31