Медленный SQL-запрос с LEFT JOIN - PullRequest
0 голосов
/ 02 октября 2018

Я уже читал подобные вопросы, но это мне не помогает.

У меня есть запрос

SELECT `login`, 
   `photo`, 
   `username`, 
   `user`.`id`, 
   `name`, 
   `msg_info` 
FROM   `user` 
       LEFT JOIN `friends` 
              ON `friends`.`child` = `user`.`fb_id` 
WHERE  `friends`.`parent` = '1111' 
ORDER  BY `msg_info` DESC 

, который обрабатывает 0,7411 секунд (и даже больше)

Показывает 158 всего строк (хорошо, я могу ограничить это, но запрос все еще медленный)

Каждая из таблиц друзья и пользователь имеет более 200 000 строк

Что я могу сделать, чтобы запрос выполнялся быстрее?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

По предложению @MrVimes иногда добавление условия в предложение JOIN может иметь большое значение:

SELECT login, photo, username, user.id, name, msg_info
FROM user u
INNER JOIN friends f ON f.child = u.fb_id AND f.parent = '1111'
ORDER BY msg_info DESC;

Если, конечно, все ваши PK и FK определены правильнои проиндексированы.

0 голосов
/ 02 октября 2018

Как отмечалось в комментариях, ваше левое соединение на самом деле не отличается от следующего запроса внутреннего соединения:

SELECT
    login,
    photo,
    username,
    user.id,
    name,
    msg_info
FROM user u
INNER JOIN friends f
    ON f.child = u.fb_id
WHERE
    f.parent = '1111'
ORDER BY
    msg_info DESC;

Мы можем попытаться добавить индекс в таблицу friends для (parent, child, name, msg_info, ...).Я не уверен, какие другие столбцы принадлежат friends, но основная идея состоит в том, чтобы создать индекс для parent, ускорить предложение WHERE и, надеюсь, воспользоваться преимуществом низкой мощности в столбце parent.Затем мы включаем столбец child, чтобы ускорить объединение.Мы также включили все остальные столбцы в предложение select, чтобы индекс охватывал другие нужные нам столбцы.

CREATE INDEX idx ON friends (parent, child, name, msg_info, ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...