Мне было поручено поддерживать приложение для клиента, который очень медленный. Я включил MySQL slow_query_log и нашел несколько запросов, которые кажутся виновными. Я немного смущен в отношении того, что делает этот запрос, но любые рекомендации о том, как я мог бы переписать это, были бы полезны.Really Slow Выполнение MySQL Query
SELECT
table_a.id AS table_a_id_1,
table_a2.id AS table_a_id_2
FROM
table_a,
table_b
LEFT JOIN
table_a AS table_a2
ON
table_a.value = table_a2.value
WHERE
table_a.value_id = 112 AND
table_a2.value_id = 113 AND
table_a.status != table_a2.status AND
table_a.id = table_b.id;
Для меня это выглядит как запрос выбирает одни и те же данные дважды из одной таблицы, а затем делать какие-то сравнения с выбранными данными, а также для выполнения объединения с TABLE_B, а также. Вот журнал из MySQL, ссылающийся на выполнение этого запроса.
Query_time: 160.854398
Lock_time: 0.000139
Rows_sent: 12
Rows_examined: 10339025
Любой совет, который вы могли бы предоставить, был бы полезен!
Я даже не думаю, что запрос действителен ... Вы уверены, что он работает правильно? Вы внесли какие-либо изменения в запрос перед его публикацией? –
Я тоже не думал, что это действительно так, это выглядит странно для меня. Однако он работает без ошибок и возвращает строки. Единственные изменения, которые я внес в запрос, заключались в замене имен таблиц на таблицы_a и table_b ... и т. Д. Я проверю и посмотрю, смогу ли я опубликовать фактический полный запрос, если вы думаете, что это поможет. Это еще более запутанно ... LOL! –
Это очень плохая идея объединить эксплицитные и неявные объединения (и использование неявных объединений вообще - это антиспам SQL). Простое исправление для использования explict joins wil probaly help, тогда вам нужно исправить части вашего запроса, которые являются плохими ошибками. См. Мои комментарии в ответе @ GordonLinoff. – HLGEM