MySQL очень медленный запрос на mariaDB - PullRequest
0 голосов
/ 11 мая 2019

Ниже приведен запрос на новый сервер, на который я перемещаю сайт. Приведенный ниже запрос выполняется очень быстро на исходном сервере с InnoDB. Новый сервер MariaDB 5.6 работает исключительно медленно.

Единственная строка, которую необходимо удалить на новом сервере, это «AND np.user_id! = Su.id», и она снова становится быстрой.

Подзапрос никак не влияет на скорость.

Я не знаю достаточно о разных версиях БД, чтобы иметь представление о том, почему это так.

Может ли кто-нибудь пролить свет на проблему? Заранее спасибо.

SELECT
    np.id, np.user_id, np.post_id, np.response_id, np.viewed, np.clicked, np.emailed, np.timestamp,
    su.id AS suUserId, 
    su.fullname AS suFullName, su.username AS suUserName, su.mem_id AS suMemId 
FROM notify_post np 
    LEFT JOIN userfeed pf ON np.response_id IS NULL AND pf.id=np.post_id
    LEFT JOIN userresponses pr ON np.response_id IS NOT NULL AND pr.userfeed_id=np.post_id

    JOIN users su ON 
        (np.response_id IS NULL AND su.id=pf.user_id) 
        OR 
        (np.response_id IS NOT NULL AND su.id=pr.user_id AND pr.id=np.response_id)

WHERE np.user_id=1 
    AND pf.user_id NOT IN (SELECT bk.block_id FROM block bk WHERE bk.user_id=1 AND bk.block_id=pf.user_id)
    AND np.user_id!=su.id
ORDER BY np.timestamp DESC
LIMIT 0,10

1 Ответ

0 голосов
/ 24 мая 2019

Переосмыслите дизайн схемы.Этот паттерн действительно плохо сказывается на производительности:

WHERE (x IS NULL     AND ...)
   OR (x IS NOT NULL AND ...)

Он четко виден в этой форме в одном случае (ON) плюс два менее очевидных места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...