Какова стоимость индексации нескольких столбцов дБ? - PullRequest
6 голосов
/ 07 января 2009

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

UPDATE

Я индексирую point_value, user_id и event_id, все необходимые для клиентских целей. Для например, забил бейсбольные заезды по идентификатору игрока и идентификатору игры. Что бы быть стоимость вставки около 200 новых записи в день, после того, как таблица держит записи за два сезона, скажем, 72000 работает, и после 5 сезонов, может быть, четверть миллиона записей? Только для иллюстрация, но я ожидаю вставить от 25 до 200 записей день.

Ответы [ 7 ]

12 голосов
/ 07 января 2009

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

Затем запустите ваше приложение и периодически собирайте статистику, чтобы увидеть, как работает база данных. RUNSTATS для DB2 является одним из примеров, я надеюсь, что MySQL имеет аналогичный инструмент.

Если вы обнаружите, что некоторые часто выполняемые запросы выполняют полное сканирование таблицы (или занимают слишком много времени по другим причинам), тогда и только затем следует добавить дополнительные индексы. Нет смысла оптимизировать запрос, выполняемый раз в месяц, поэтому он может завершиться в 12:05 вместо 12:07. Тем не менее, это огромное улучшение, заключающееся в том, чтобы уменьшить количество обращений к клиенту с 5 до 2 секунд (это все еще слишком медленно, по возможности запросы к клиенту должны составлять менее секунды).

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

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

Если честно, я не верю, что индексирование трех столбцов в таблице приведет к страданиям, если вы не планируете хранить действительно огромное количество строк :-) - индексация довольно эффективна.


После вашего редактирования, которое гласит:

Я индексирую point_value, user_id и event_id, все необходимые для работы с клиентами. Для примера, такого как подсчет очков, бейсбол запускается по идентификатору игрока и идентификатору игры. Сколько будет стоить вставка около 200 новых записей в день, после того, как таблица содержит записи за два сезона, скажем, 72 000 прогонов, и после 5 сезонов, может быть, четверть миллиона записей? Только для иллюстрации, но я ожидаю вставлять от 25 до 200 записей в день.

Мой ответ таков: 200 записей в день - это чрезвычайно малая ценность для базы данных, вам точно не о чем будет беспокоиться с этими тремя индексами.

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

Теперь предоставлено, что это в базе данных DB2, но я не могу представить, что IBM , поэтому намного лучше, чем люди из MySQL, что MySQL может обрабатывать только менее 0,01% нагрузки DB2.

10 голосов
/ 08 февраля 2010

Я провел несколько простых тестов, используя свой реальный проект и настоящую базу данных MySql.

Мои результаты: добавление среднего индекса (1-3 столбца в индексе) к таблице - замедляет вставки на 2,1%. Таким образом, если вы добавите 20 индексов, ваши вставки будут медленнее на 40-50%. Но ваш выбор будет в 10-100 раз быстрее.

Так нормально ли добавлять много индексов? - Это зависит :) Я дал вам свои результаты - Вы решаете!

6 голосов
/ 07 января 2009

Ничего для запросов на выборку, хотя обновления и особенно вставки будут на порядок медленнее - что вы не заметите, прежде чем начнете вставлять МНОЖЕСТВО строк одновременно ...

Фактически, у предыдущего работодателя (однопользовательская, настольная система) мы фактически УДАЛЯЛИ индексы перед запуском нашей «процедуры импорта», которая сначала удаляла бы все записи перед тем, как вставлять огромное количество записей в одну таблицу ... *

Затем, когда мы закончили работу по вставке, мы воссоздадим индексы ...

Мы бы сэкономили 90% времени на этой операции, отбрасывая индексы перед началом операции и создавая ее заново ...

Это была база данных Sybase, но те же цифры применимы к любой базе данных ...

Так что будьте осторожнее с индексами, они FAR от "свободных" ...

3 голосов
/ 13 января 2010

Только для иллюстрации, но я ожидаю вставлять от 25 до 200 записей в день.

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

1 голос
/ 07 января 2009

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

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

0 голосов
/ 10 января 2009

Что сказал Пакс.

Для измерений, которые вы описываете, единственное существенное беспокойство, которое я могу себе представить, это "Сколько стоит отказ от индексации нескольких столбцов в дБ?"

0 голосов
/ 07 января 2009

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

Если вы обнаружите, что скорость операций вставки медленная из-за индексации, то эту проблему вы можете решить на аппаратном уровне, используя больше ЦП, ОЗУ и улучшенную технологию жесткого диска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...