Какова стоимость индексации нескольких столбцов db?

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

ОБНОВЛЕНИЕ

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

Ответ 1

Укажите, что кажется наиболее логичным (что, мы надеемся, будет очевидным, например, столбец идентификатора клиента в таблице 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.

Ответ 2

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

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

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

Ответ 3

Ничего для выбранных запросов, хотя обновления и особенно вставки будут более медленными, а вы не заметите, прежде чем вы начнете вставлять много строк в одно и то же время...

Фактически у предыдущего работодателя (одиночного пользователя, настольной системы) мы фактически DROPPED индексы перед началом нашей "процедуры импорта", которая сначала удалит все записи, прежде чем вставлять огромное количество записей в одну и ту же таблицу...

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

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

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

Поэтому будьте осторожны с индексами, они FAR от "free"...

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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