понимание индексов с помощью простого запроса выбора - PullRequest
2 голосов
/ 17 января 2012

Я пытаюсь понять, как правильно работать с индексами с базовыми запросами.

пример:

У меня есть таблица 'testme' со следующими столбцами:

id int primary key
username varchar(20)
data1 int
data2 int
data3 int
data_order int

если я сделаю

select username,data1,data2 from testme where data3=5 order by data_order;

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

Я попытался добавить индекс для столбцов data3 и data_order, но результат 'объяснения' к этому запросу показывает, что он не использует этот индекс.

обновление: использование кластера mysql (ndb)

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Думайте об Индексе как о двух вещах ...
1. Порядок, в котором хранятся данные
2. Быстрый способ поиска определенных фрагментов данных (например, указатель книги)

В вашем примере наличие индекса на (data3, data_order) позволит очень легко найти нужные данные и уже иметь их в правильном порядке.

Для поиска полей по-прежнему необходимо перейти к таблице, чтобы получить поля username, data1, data2. По этой причине вы можете include добавить их в индекс. Это делает индекс больше, используя больше места и немного больше усилий для обновления. Но эта стоимость означает, что индекс не присоединен к таблице. Это просто чтение индекса.

2 голосов
/ 17 января 2012

для этого конкретного запроса есть два индекса, которые помогут -

Индекс для data3 (хэш, если вы уверены, что будут только запросы с data3, равным чему-либо, в противном случае используйте btree) и индекс для data_order (btree)

РЕДАКТИРОВАТЬ: в этом случае отдельные индексы лучше, потому что AFAIK mysql не всегда ищет составной индекс для оператора where и order, и другая проблема заключается в том, что позже вы не можете использовать только заказ, используя этот индекс (indexбудет для data3 + data_order или только для data3, поскольку mysql читает индексы из крайнего левого столбца)

1 голос
/ 17 января 2012

Лучший индекс для случая (на самом деле зависит от размера таблицы и количества элементов date3):

CREATE INDEX yourindex ON yourtable(Data3, Data_order)
INCLUDE(username, data1, data2)

или, если mysql не поддерживает включение столбцов

CREATE INDEX yourindex ON yourtable(Data3, Data_order, username, data1, data2)

Почему лучше?

  • фильтрация по прямым date3 значениям
  • заказов по data_order значению
  • включает в себя все, что вам нужно для выбора списка (индекс покрытия) (если mysql поддерживает, в том числестолбцы)

Обновление:

Для небольших таблиц оптимизатор может выбрать сканирование таблицы вместо индекса.

Чем больше данных в вашей таблице, *, тем вероятнее будет использоваться индексов, особенно если количество элементов индекса достаточно велико

...