Mysql как установить лучшие индексы для моего запроса

#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 предложение приведет к созданию другого набора результатов.