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