Таблицы необязательно объединяются в порядке, указанном в предложении FROM
. В этом случае, похоже, что MySQL решил, что при отсутствии в запросе предложения WHERE
, вероятно, сначала быстрее всего просканировать таблицу пользователей, а затем объединить ее с другими таблицами.
Первым делом я бы запустил ANALYZE TABLE
для всех трех таблиц, задействованных в запросе. Это обновляет статистику таблиц и распределение хранимых ключей и позволяет оптимизатору соединений принимать более правильные решения. Затем запустите оператор EXPLAIN
и посмотрите, изменился ли он.
Если оно не изменилось, возможно, вам придется прибегнуть к использованию ключевого слова STRAIGHT_JOIN
. Это заставляет оптимизатор объединения объединять таблицы в точном порядке, указанном в запросе. Чтобы определить, следует ли вам это делать, вы должны взять произведение всех значений rows
из результата EXPLAIN
и сравнить его с фактическим количеством строк, возвращаемых запросом. Поэтому в этом случае сравните 1629 (181x9x1) с фактическим количеством строк. Если они существенно различаются, может потребоваться STRAIGHT_JOIN
(используется как ключевое слово для SELECT
, т. Е. SELECT STRAIGHT_JOIN n.nid
... и т. Д.).
Кроме того, есть способ указать MySQL использовать определенный индекс , но я не думаю, что он будет работать для вашей пользовательской таблицы в этом запросе, как сейчас, так как не является WHERE
пунктом. Если вы в конечном итоге используете STRAIGHT_JOIN
, возможно, вам это понадобится, но в этом случае MySQL, вероятно, получит первичный ключ, если пользовательская таблица не была первой таблицей в объединении.
Вам также следует заглянуть на страницу синтаксиса EXPLAIN , чтобы получить более полезную информацию по этому вопросу.
Этот запрос не выглядит как , который медленный для того, что он есть. Без предложения where можно ожидать где-нибудь полное сканирование таблицы, и MySQL сократил его до 1700 проверенных строк. Кажется, что это было бы проблемой только в том случае, если это был запрос с высокой интенсивностью использования, и в этом случае вы можете изучить базовую архитектуру, которая (без предложения WHERE
) предполагает выполнение запроса, который затронет каждого пользователя в системе. , и будет становиться все тяжелее по мере добавления новых пользователей.