#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. имена индексов также используются в ссылках на индексы и отображаются в планах запросов