Индексирование каждого столбца в таблице
У меня есть пара вопросов относительно индексации MySQL:
1) Есть ли увеличение скорости при индексации таблицы, хранящейся в памяти?
2) При поиске в моей таблице, которую я сопоставляю в поле столбца, индексирует ли каждый столбец потерю цели индекса?
Большое спасибо.
4 ответа
Индексирование любой таблицы, основанной на памяти или файловой системе, ускорит запросы, которые выбирают или сортируют результаты на основе этого столбца. Это связано с тем, что индекс работает как древовидная структура, а расстояние поиска зависит от глубины дерева, которая увеличивается намного медленнее, чем количество строк в столбце (логарифмическое).
Индексирование каждого столбца не противоречит цели индекса, но замедляет вставки и обновления, потому что эти изменения приведут к обновлению каждого индекса этой таблицы. Кроме того, индексы занимают место на сервере базы данных, что является еще одним недостатком.
Другие вопросы для чтения, относящиеся к этому вопросу:
Лучшие практики для индексирования
Что такое индекс
Сколько индексов достаточно
1) Да, конечно.
2) Нет, это не противоречит цели индекса. Просто помните, что mysql не может использовать более 1 индекса на таблицу и что добавление большего количества индексов замедляет операции вставки / обновления / удаления. Поэтому избегайте создания неиспользуемых индексов, вместо этого создайте многоколоночные индексы, которые лучше всего соответствуют вашим запросам.
Стоимость индекса в дисковом пространстве обычно тривиальна. Стоимость дополнительных записей для обновления индекса при изменении таблицы часто умеренная. Стоимость дополнительной блокировки может быть серьезной.
Это зависит от соотношения чтения и записи в таблице и от того, как часто индекс фактически используется для ускорения запроса.
Индексы занимают место на диске для хранения и занимают время для создания и обслуживания. Неиспользованные не дают никакой пользы. Если для запроса имеется много индексов-кандидатов, запрос может быть замедлен, если сервер выберет "неправильный" для запроса.
Используйте эти факторы, чтобы решить, нужен ли вам индекс.
Обычно можно создавать индексы, которые НИКОГДА не будут использоваться - например, и индекс для (не нулевого) поля только с двумя возможными значениями почти наверняка будет бесполезным.
Вам нужно объяснить запросы вашего собственного приложения, чтобы убедиться, что часто выполняемые запросы используют разумные индексы, если это возможно, и создавать не больше индексов, чем требуется для этого.
Вы можете получить больше, перейдя по этим ссылкам: Для MySQL: http://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL
По поводу 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)