избегать полного сканирования индекса - PullRequest
0 голосов
/ 29 ноября 2018

Я использую тестовую базу данных от Сотрудники MySQL - тестируем базу данных Я хочу оптимизировать запрос

SELECT emp_no, SUM(salary)
FROM salaries
WHERE from_date < '1999-01-01'
group by emp_no;

Стоимость запроса: 287790

, какие индексы могут мне помочь?

Я пытаюсь создать индекс с emp_no и salary, а также emp_no и from_date, но результата нет.Существует полный индекс сканирования.

Также попытался использовать OVER (PARTITION BY) вместо GROUP BY

SELECT emp_no, SUM(salary) OVER (PARTITION by emp_no)
FROM salaries  
WHERE from_date < '1999-01-01'; 

, чтобы избежать, например, полного сканирования индекса или использовать OVER вместо GROUP BY

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Это зависит от того, какую версию вы используете.

Старая версия: INDEX(from_date, emp_no, salary) "покрывает" и будет выполнять "диапазонное" сканирование части индекса.Однако GROUP BY, вероятно, будет включать сортировку.

Более новая версия: INDEX(emp_no, from_date, salary) также "покрывает", но может перемещаться по индексу, не касаясь каждой строки.Вероятно, этого можно избежать.

Вот еще одна вещь для проверки:

SELECT emp_no,
       ( SELECT SUM(salary) FROM salaries
             WHERE emp_no = e.emp_no 
               AND from_date < '...')
    FROM employees AS e

Примечание: я предполагаю, что employees имеет одну строку на сотрудника, в отличие от salaries ??Этот подход позволяет избежать GROUP BY, но имеет издержки коррелированного подзапроса.Теперь salaries требуется INDEX(emp_no, from_date, salary) - в этом порядке, и каждый раз выполняется сканирование меньшего диапазона в индексе.

0 голосов
/ 29 ноября 2018

Чтобы получить план выполнения, который позволяет избежать полного сканирования, MySQL необходим индекс с from_date в качестве ведущего столбца.

Оптимально, индекс будет содержать все другие столбцы, на которые есть ссылки в запросе., чтобы избежать поиска значений на базовых страницах данных.

Обратите внимание, что если план выполнения использует этот индекс, то он должен вызвать операцию «Использование файловой сортировки» для удовлетворения GROUP BY.

...