#mysql #sql
Вопрос:
Пожалуйста, проверьте мой запрос и предложите мне значение индексации и как я могу решить, какие столбцы будут в индексах. Запрос выполняется очень медленно, когда предложение where существует, в противном случае запрос просто прекрасен. Значение смещения также замедляет запрос.
SELECT
attachment.attachment_id AS attachmentID,
attachment.data_item_id AS candidateID,
attachment.title AS title,
candidate.first_name AS firstName,
candidate.last_name AS lastName,
candidate.city AS city,
candidate.state AS state
FROM
attachment
LEFT JOIN candidate
ON attachment.data_item_id = candidate.candidate_id
where candidate.is_active = 1
ORDER BY
lastName ASC
LIMIT 92000, 20
Комментарии:
1. отредактируйте свой вопрос , чтобы отобразить вывод (в виде текста)
show create table yourtablename
(для каждой таблицы, используемой в запросе), иexplain SELECT ...rest of your query
, пожалуйста2. Принимая во внимание замечания GL относительно избыточного внешнего соединения, взгляните на превосходную (хотя и несколько устаревшую) статью Квассноя о поздних поисках строк: explainextended.com/2009/10/23/…
3. Запрос неправильно сформирован. Предикат
candidate.is_active = 1
побеждает внешнее соединение и заставляет его эффективно работать как внутреннее соединение. Пожалуйста, сначала исправьте запрос.4. Во-первых, объясните, зачем вам это нужно
OFFSET 92000
и какой тип списка будет таким длинным.
Ответ №1:
Ваш запрос в основном:
SELECT . . .
FROM attachment a JOIN
candidate c
ON a.data_item_id = c.candidate_id
WHERE c.is_active = 1
ORDER BY c.last_name ASC
LIMIT 92000, 20;
Обратите внимание, что WHERE
предложение LEFT JOIN
INNER JOIN
в любом случае превращает в, так что нет причин использовать LEFT JOIN
.
Я бы рекомендовал следующие индексы:
candidate(is_active, candidate_id, last_name)
attachment(data_item_id)
Вы можете расширить индексы, чтобы включить в них все выбранные столбцы.
Обратите внимание, что для смещения 92 000 строк требуется немного усилий, поэтому запрос никогда не будет молниеносным.
Комментарии:
1. любопытно, действительно ли первого индекса будет достаточно для заказа по, по крайней мере, sql-сервер выполняет дорогостоящую операцию сортировки,решаемую только добавлением кандидата(фамилия, имя кандидата). Или есть лучший способ?
2. @Teson . . . Я ожидал бы, что это сработает, но вам нужно будет протестировать его в своей системе, чтобы убедиться, что он работает.
3. Я перемещаю предложение where в join, а затем запрашиваю намного быстрее (занимает 8 секунд), поэтому скорость улучшится примерно на 2 секунды ?
4. @AshishNishad . . . Я не понимаю вашего комментария. Перемещение
where
условия вon
предложение приведет к созданию другого набора результатов.