Все столбцы таблицы должны быть проиндексированы или нет базы данных mysql? - PullRequest
4 голосов
/ 20 января 2012

Я хочу сделать одну таблицу с 4 столбцами. Один является первичным ключом, а остальные три столбца являются ссылками на столбцы других таблиц. Я хочу использовать его, чтобы объединить эти четыре таблицы для создания поискового фильтра. Эти соединения занимают время.

Я подумал, что мне следует индексировать эти столбцы, потому что я прочитал, что добавление индексов для столбцов, используемых в условиях соединения [заставляет их работать быстрее]. Мой вопрос будет ли проблема, если все столбцы таблицы будут проиндексированы? Или есть какой-то другой способ уменьшить временную сложность поискового фильтра. Заранее спасибо.

Подробнее Подсказка: Таблица 1 (основной поиск) -1000 записей основной ключ fk1 ФК2 FK3

Таблица2-800 записей pk1 .. (8-9 столбцов)

Таблица 3-700 записей pk2 .. (10-12 столбцов)

Таблица2-850 записей pk3 .. (7-8 столбцов)

Ответы [ 8 ]

9 голосов
/ 25 января 2012

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

Поскольку индексы являются толькоиспользуемый для ускорения поиска совпадающего поля в записях, само собой разумеется, что индексация полей, используемых только для вывода, будет просто пустой тратой дискового пространства и времени обработки при выполнении операции вставки или удаления, и, следовательно, ее следует избегать.Также, учитывая природу бинарного поиска, важна мощность или уникальность данных.Индексирование в поле с количеством элементов, равным 2, делит данные пополам, тогда как количество элементов в 1000 возвращает приблизительно 1000 записей.При таком низком количестве элементов эффективность снижается до линейной сортировки, и оптимизатор запросов избегает использования индекса, если количество элементов превышает 30% от числа записей, что фактически делает индекс пустой тратой пространства.

Так что лучше добавить индексацию по группе столбцов.

4 голосов
/ 29 января 2012

Чтобы правильно индексировать ваши данные по производительности, вам нужно понимать ваши данные. Гипотетически, скажем, я создавал таблицу базы данных переписи:

CREATE TABLE CENSUS
(
    ID INTEGER NOT NULL,
    GENDER CHAR(1) NOT NULL,
    FAVOURITEFOOD NVARCHAR(20) NOT NULL,
    STATE NVARCHAR(20) NOT NULL
);

Из-за обработки данных я могу знать, что:

  • Пол делится на 50% мужчин, 50% женщин
  • 60% любят жаркое, 20% вегетарианцы, 20% любят азиатскую еду, 20% любят макароны
  • Штат составляет 25% калифорнийцев, 25% Нью-Йорка, а остальные 1% в каждом штате.

Если бы я хотел искать людей мужского пола, которые любят жаркое и живут в Калифорнии, я бы рассмотрел создание многостолбцового индекса, в котором на первом месте стоит STATE (STATE, GENDER, FAVOURITEFOOD). Я делаю FAVOURITEFOOD последним столбцом в индексе. Это связано с тем, что фильтр STATE обрезает данные на 25%, тогда как FAVOURITEFOOD возвращает большую часть базы данных (не лучше, чем полное сканирование таблицы).

Если бы я хотел искать женщин, которые любят вегетарианскую еду и живут в Нью-Йорке, я бы подумал о создании многостолбцового индекса и о том, чтобы сначала поставить FAVOURITEFOOD (FAVOURITEFOOD, STATE, GENDER). Здесь FAVOURITEFOOD сортирует данные на 20%, так что это лучший выбор по сравнению с двумя другими столбцами.

Если я часто выполняю ОБА запросы, какой индекс мне следует сделать? Ответ оба:

CREATE INDEX IX_CENSUS_001 ON CENSUS (STATE, GENDER, FAVOURITEFOOD);
CREATE INDEX IX_CENSUS_002 ON CENSUS (FAVOURITEFOOD, STATE, GENDER);
ANALYZE TABLE CENSUS;

Команда ANALYZE TABLE сохраняет распределение ключей для таблицы. Теперь, когда вы выполните любой запрос, он определит, является ли IX_CENSUS_001 или IX_CENSUS_002 лучшим индексом для плана выполнения.

Если я захочу запустить разные типы запросов, я остановлюсь и снова подумаю о своих данных. Возможно, мне потребуется добавить новый индекс, и мне может понадобиться снова запустить ANALYZE TABLE.

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

3 голосов
/ 20 января 2012

В столбцах ссылочной таблицы должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке.

Такой индекс создается в ссылочной таблице автоматически, если он не существует.

Прочтите статью ниже: Как индексировать соединения с MySQL

3 голосов
/ 20 января 2012

Индексы не являются волшебными таблетками.

Конечно, они могут ускорять запросы, но они также замедляют запись (вставку / обновление / удаление) и занимают драгоценную оперативную память.

Используйте их осторожно.

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

MySQL допускает несколько типов индексов, таких как индекс первичного ключа, уникальный индекс, нормальный индекс, также известный как («неуникальный индекс», обычный индекс, индекс без ограничений ») и полнотекстовый индекс. Конечно, индексы улучшаются Запросы SELECT чрезвычайно быстры, но у них есть и существенные недостатки. Преимущества индексов MySQL

Вообще говоря, индексация MySQL в базе данных дает три преимущества:

Query optimization: Indexes make search queries much faster.
Uniqueness: Indexes like primary key index and unique index help to avoid duplicate row data.
Text searching: Full-text indexes in MySQL version 3.23.23, users have the opportunity to optimize searching against even large amounts of text located in any field indexed as such.

проверить это

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

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

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

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

0 голосов
/ 23 января 2012

Вместо добавления индексов, если вы добавите первичный ключ главной таблицы в другие таблицы и присоедините таблицы в этом поле, это будет быстрее.

0 голосов
/ 20 января 2012

Я думаю, что индексирование всех четырех столбцов на самом деле не улучшит вашу производительность, потому что вам все равно потребуется полное сканирование индекса, которое по сути будет таким же, как полное сканирование таблицы. Ваш индекс будет просто повторять данные в вашей таблице. Вы можете вставить свой запрос?

...