Подразумевание нескольких ключей MySQL с одним и тем же именем

#mysql #codeigniter #indexing #composite-key

Вопрос:

Используя отдельные запросы, я могу добавлять неуникальные индексы в таблицу MySQL, каждый со своим собственным именем ключа, например:

введите описание изображения здесь

Но когда я использую класс database forge своей PHP-платформы (CodeIgniter 3) для добавления нескольких ключей во время запроса на СОЗДАНИЕ ТАБЛИЦЫ, все они получают одно и то же имя ключа, но с другим значением Seq_in_index.

PHP-код:

 $this->dbforge->add_key(['estimate_id', 'order_number']);
// produces: KEY `estimate_id_order_number` (`estimate_id `, `order_number `)
 

Результирующие ключи:

введите описание изображения здесь

Я действительно не знаю, что, так сказать, «лучше». Последняя конфигурация таблицы, по-видимому, указывает на то, что для индексации как estimate_id, так и order_id используется один ключ.

Вызовет ли это какие-либо проблемы, такие как неоднозначность между полями?

Есть ли какие — либо последствия для производительности для любого дизайна таблицы?

Для каких ситуаций могут потребоваться отдельные имена ключей?

Комментарии:

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

2. show create table yourtablename это гораздо лучший способ увидеть структуру вашей таблицы и индексы

3. @ysth хорошо, значит, это ключ с несколькими столбцами, я этого не понимал. Я удивляюсь, почему метод таблицы создания структуры создает это по умолчанию.

Ответ №1:

Это составной ключ, также известный как составной индекс. В индекс BTREE включено несколько столбцов.

В вашем случае ключ определяется как

  ALTER TABLE tbl
     ADD KEY estimate_id_order_number (estimate_id, order_number)
 

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

Если у вас есть такой запрос, как

 SELECT id FROM tbl WHERE estimate_id = 123 AND order_number = 321
 

или

 SELECT id FROM tbl WHERE estimate_id = 123 ORDER BY order_number
 

этот индекс позволит ему работать очень быстро: запрос может быть удовлетворен с помощью составного ключа.

Но если у вас есть

 SELECT id FROM tbl WHERE order_number = 321
 

это не поможет: составной индекс помогает только тогда, когда в предложении WHERE упоминается его первый столбец. Но ключ с колонками (order_number, estimate_id) поможет.

Комментарии:

1. имена индексов также используются в ссылках на индексы и отображаются в планах запросов