Индексирование каждого столбца таблицы

У меня есть несколько вопросов относительно индексации MySQL:

1) Есть ли увеличение скорости при индексировании таблицы, хранящейся в памяти?

2) При поиске моей таблицы я совпадаю с полем столбца, индексирует ли каждый столбец цель индекса?

Большое спасибо.

Ответ 1

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

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

Другие ответы на вопросы, относящиеся к этому вопросу:

Рекомендации по индексированию
Что такое индекс
Сколько индексов достаточно

Ответ 2

1) Да, конечно.
2) Нет, это не отменяет цели индекса. Просто помните, что mysql не может использовать более одного индекса для таблицы и что добавление дополнительных индексов замедляет операции вставки/обновления/удаления. Поэтому избегайте создания индексов, которые не используются, создайте индексы с несколькими столбцами, которые лучше всего соответствуют вашим запросам.

Ответ 3

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

Это зависит от отношения чтения и записи в таблице и от того, как часто индекс используется для ускорения запроса.

Индексы используют дисковое пространство для хранения и требуют времени для создания и обслуживания. Неиспользованные не приносят никакой пользы. Если есть много индексов-кандидатов для запроса, запрос может быть замедлен, если сервер выбрал "неправильный" для запроса.

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

Обычно можно создавать индексы, которые НИКОГДА не будут использоваться - например, и индекс в (не нулевом) поле с двумя возможными значениями почти наверняка будет бесполезным.

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

Вы можете получить больше, следуя этим ссылкам: Для mysql: http://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL

Для DB2: http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005052.htm

Ответ 4

По поводу Q1... Оптимизатор запросов иногда выбирает сканирование таблицы, даже если существует "совершенно хороший" индекс. Этот компромисс основан на сложном алгоритме, но, как правило:

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

Это объясняется следующим: использование индекса означает сканирование индекса BTree (который очень похож на таблицу), а затем переход к данным BTree для поиска записи. Этого туда и обратно избегают, если он просто сканирует данные. Недостатком является то, что он должен игнорировать до 80% строк.

Следствие: не беспокойтесь о индексировании "флагов" (0/1, T/F, M/F, Да/Нет) или столбцов с низкой кардинальностью (да/нет/возможно, M/F/и т.д., День недели,...).

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

WHERE deleted=0 AND created_at > NOW() - INTERVAL 1 DAY
INDEX(deleted, created_at)