Индексирование MySQL, одно или несколько столбцов? - PullRequest
0 голосов
/ 09 декабря 2018

В настоящее время у меня настроена таблица, в которой таблица «Info» подключается к таблицам «Event» и «Stage».

EVENT TABLE

id | categoryId | name
1  | 1          | Event1
2  | 2          | Event2
3  | 1          | Event3
[ ... About 100 rows ... ]

STAGE TABLE

id | categoryId |name
1  | 1          | Stage1
2  | 1          | Stage2
3  | 2          | Another Stage
[ ... About 200 rows ... ]

ИНФО ТАБЛИЦА

id | eventId | stageId | info
1  | 1       | 1       | Hello
2  | 1       | 2       | Something
3  | 1       | 1       | Else
4  | 2       | 3       | More
[ ... X00,000 rows ... ]
  • Все мои запросы к информационной таблице будут содержать предложение WHERE как для eventId, так и stageId, тамникогда не будет случая, когда мне понадобится несколько eventIds и stageIds в одном запросе.
  • Я не могу выполнить запрос только через stageId, так как они могут быть связаны с несколькими eventIds.
  • Как и в моемВ приведенном выше примере события EventIds и stageIds не могут быть сгруппированы вместе.

Запросы MySQL не представляют собой ничего сложного, никаких объединений:

SELECT * FROM info WHERE eventId = 1 AND stageId = 1

В этом случае я не был уверен, какнужно ли в таблице «Инфо» индексировать столбцы eventId и stageId по отдельности или вместе в виде мультииндекса.Информация там часто заканчивается тем, что «это зависит от ваших настроек».

Ускоряется ли чтение по мультииндексу?Есть накладные расходы, которые могут не оправдать это?Должен ли я придерживаться нормального индекса на обоих?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

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

Согласно документации MySql , если у вас есть 2 отдельных индекса, MySql будет использовать только один из них:

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

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

0 голосов
/ 09 декабря 2018

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

Кроме того, если у вас есть запрос к информационной таблице, который зависит только от eventId илиstageId, затем вы можете заказать индексирование и иметь этот столбец первым в индексе.Как и в индексе с (eventId, stageId), мы позаботимся о запросах с поиском {eventId}, а также {eventId, StageId}

Кроме того, если eventId и StageId будут уникальными для информационной таблицы, вы можетепросто объявите его как первичный ключ и покончите с идентификатором.

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