mysql — индексировать столбец суммы

спросил

Изменено 5 лет, 10 месяцев назад

Просмотрено 26 тысяч раз

Является ли создание индекса для суммируемого столбца быстрее, чем отсутствие индекса?

  • mysql
  • sql
  • sql-сервер
  • индексация
  • сумма

Извините, непонятно, о чем вы спрашиваете.

Вы спрашиваете, ускорит ли это запрос, такой как

 ВЫБЕРИТЕ продукт, сумма (количество) ИЗ чеков
СГРУППИРОВАТЬ ПО продукту
 

если вы добавили индекс по количеству?

Если это вопрос, то ответ — нет. Вообще говоря, индексы полезны, когда вам нужно найти всего несколько строк среди множества; здесь вам нужны все строки, поэтому индекс не поможет.

Существует неясное исключение (которое применяется так редко, что большинство оптимизаторов БД, вероятно, не утруждают себя реализацией этого трюка). Если ваш запрос имеет вид

 SELECT sum(foo) FROM bar
 

, где есть индекс для foo, а bar — это таблица с множеством столбцов, можно прочитать в полном индексе, что приведет к меньшему количеству попаданий, чем если бы вы читали базовую таблицу, и получить ответ непосредственно из индекса — вообще никогда не прикасаться к «настоящему» столу! Однако это довольно редкий случай, и вы захотите проверить, что ваш оптимизатор умеет это делать, прежде чем слишком полагаться на это.

4

Нет. Индексы улучшают поиск, ограничивая количество требуемых проверок. Агрегатная функция (количество, максимум, минимум, сумма, среднее) должна выполняться независимо от всех записей в столбце.

1

Если вы хотите сделать суммирование быстрее, вы можете предварительно материализовать результат. В Oracle используйте материализованные представления, в MS SQL используйте индексированные представления.

На ваш конкретный вопрос «Является ли создание индекса для суммируемого столбца быстрее, чем отсутствие индекса?» Ответ №

Ответ на ваш вопрос лежит в ответе Спенсера:

«Агрегатная функция (количество, максимум, минимум, сумма, среднее) должна пройти через все записи в суммируемых столбцах, независимо от того».

Просто уточнил контекст столбцов в ответе Спенсера. Тем не менее его ответ правильный.

Если индекс покрывает, то обычно это происходит быстрее. Насколько быстрее будет определяться разница между количеством столбцов в таблице и количеством в индексе. Кроме того, может быть быстрее, если есть какие-либо критерии фильтрации.

Я обнаружил, что индексация столбца в таблице where(productid here) помогает при использовании этого запроса:

SELECT productid, sum(quantity) FROM квитанций WHERE productid = 1 GROUP BY productid

Один из моих запросов увеличился с 45 секунд до почти мгновенно, как только я добавил index.

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Видеоруководство по оператору SQL CREATE INDEX с MySql

Индексы — это специальные таблицы поиска, которые поисковая система базы данных может использовать для ускорения поиска данных.


Они также организуют способ хранения данных в базе данных.

 

Индексы в таблице очень похожи на каталог в библиотеке; если у вас нет каталога, а я попрошу вас найти конкретную книгу в Британской библиотеке в Лондоне, содержащей более 150 миллионов единиц хранения, вам придется просмотреть каждую книгу в библиотеке, а это займет время 😉

С другой стороны, если у вас есть каталог, вы ищете книгу в каталоге и сразу идете на указанную полку.

Без индекса система баз данных считывает всю таблицу (этот процесс называется «сканированием таблицы»), чтобы найти нужную информацию. При наличии надлежащего индекса система базы данных может сначала пройтись по индексу, чтобы выяснить, где получить данные, а затем перейти непосредственно к этим местам, чтобы получить необходимые данные.

Это намного быстрее.

В индексе хранится указатель на строку таблицы

Как он находит другие значения в той же строке? Ну, это совсем просто — индексы базы данных тоже хранят указатели на соответствующие строки в таблице. Указатель — это просто ссылка на место в памяти, где данные строки хранятся на диске. Таким образом, в дополнение к значению столбца, хранящемуся в индексе, в индексе также хранится указатель на строку в таблице, в которой находится это значение.

Представьте, что наша таблица «книги» ниже, имеет тысячи регистров и мы хотим найти автора книги «Андроид за 3 дня». Мы можем создать индекс со столбцом «название». Этот индекс будет выглядеть следующим образом;

Индекс
Титул Указатель
Android за 3 дня указатель
Разработка игр указатель
Java для начинающих указатель
Пружина указатель
SQL за 15 минут указатель
Пружина указатель
   

 

Одно из значений в индексе для «заголовка» может быть примерно таким («Android через 3 дня», 0×82829), где 0×82829 — адрес на диске (указатель), где находится строка данные для «Android через 3 дня» сохраняются. Без этого указателя все, что у вас было бы, — это одно значение, которое было бы бессмысленным, потому что вы не смогли бы получить другие значения в той же строке — например, «автор» книги.

SQL CREATE INDEX SYNTAX

Создание индекса включает оператор CREATE INDEX, который позволяет вам назвать индекс, указать таблицу и какой столбец или столбцы индексировать, а также указать, находится ли индекс по возрастанию (ASC) или по убыванию (DESC).

Это зависит от разных баз данных, в MySQL 5.0 эти слова анализируются, но игнорируются; значения индекса всегда сохраняются в порядке возрастания.

Если определенный столбец в операторе SELECT отсортирован в порядке убывания, обработка выполняется быстрее, если для этого столбца определен индекс убывания.

Основной формат инструкции следующий:

 CREATE INDEX <имя_индекса> 
ON <имя_таблицы> (<имена_столбцов>)
SQL CREATE INDEX EXAMPLE
SQL CREATE UNIQUE INDEX

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