sql Составные ключи и индексы. Преимущества и недостатки

Forums:

Составной ключ SQL

Составной ключ — это ключ, состоящий из двух или более столбцов в базе данных SQL. Он используется для идентификации уникальных строк в таблице и обеспечивает порядок сортировки.

Создание составного ключа

Для создания составного ключа в SQL необходимо указать несколько столбцов при определении таблицы и добавить к ним ограничение уникальности. Например, следующий код создаст составной ключ для таблицы «users», используя столбцы «id» и «email»:

CREATE TABLE users (
    id INT,
    email VARCHAR(255),
    PRIMARY KEY (id, email)
);

В данном примере составной ключ состоит из двух столбцов — «id» и «email», и обеспечивает уникальность комбинации значений этих столбцов для каждой записи в таблице «users».

Использование составного ключа

Составной ключ может быть использован для оптимизации запросов, связанных с поиском и фильтрацией данных. Например, предположим, что у нас есть таблица «orders» с составным ключом «user_id» и «order_date». Мы можем использовать этот ключ для быстрого поиска заказов пользователя за определенную дату:

SELECT * FROM orders WHERE user_id = 10 AND order_date = '2022-01-01';

Использование составного ключа позволяет базе данных эффективно найти нужную запись по комбинации указанных значений в столбцах «user_id» и «order_date».
Кроме того, составной ключ может быть использован при создании внешних ключей, связывающих таблицы между собой. Например, мы можем создать внешний ключ, используя составной ключ «user_id» и «order_date» из таблицы «orders» и ключ «id» из таблицы «users», чтобы связать эти две таблицы по определенным критериям.

Преимущества составного ключа

  1. Уникальность данных
    Составной ключ гарантирует уникальность данных в таблице. Таким образом, он предотвращает дублирование информации и обеспечивает целостность данных.
  2. Более эффективные поисковые запросы
    Составной ключ позволяет эффективно выполнять поисковые запросы, так как данные могут быть отсортированы и проиндексированы по нескольким полям одновременно. Это повышает производительность и сокращает время выполнения запросов.
    Например, если в таблице содержатся данные о пользователях и составной ключ состоит из полей «имя» и «фамилия», то поиск пользователей по этим полям будет выполняться быстрее и эффективнее, чем при использовании только одного ключа.

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

Недостатки составного ключа

  1. Усложнение структуры таблицы
    Использование составного ключа приводит к усложнению структуры таблицы. При создании таблицы с составным ключом необходимо указывать не только типы данных полей, но и их связь друг с другом. Это может затруднить чтение и понимание структуры таблицы при работе с большими объемами данных.
  2. Ограничения в допустимых операциях
    Использование составного ключа может создавать определенные ограничения при выполнении операций с таблицей. Например, если составной ключ включает в себя обязательное поле, то операции по добавлению записей в таблицу станут более сложными, так как необходимо будет указать значения для всех полей, входящих в составной ключ.
  3. Увеличение размера индекса
    Составной ключ требует создания индекса, который занимает определенное место в памяти. Чем больше полей входит в составной ключ, тем больше места будет занимать индекс. Это может привести к увеличению размера базы данных и замедлению производительности при выполнении запросов.
  • Составной ключ в SQL – это комбинация двух или больше полей.
  • Он усложняет структуру таблицы и затрудняет чтение и понимание структуры таблицы при работе с большими объемами данных.
  • Он создает ограничения при выполнении операций с таблицей, что может затруднить добавление новых записей.
  • Он увеличивает размер индекса, что может замедлить производительность при выполнении запросов.

Составной индекс

Составной индекс - индекс, который может включать 2 и более столбца.
Особенности составного индекса:

  • может включать более одного (до 16) столбцов, выступающих ключевыми значениями;
  • ограничивается общей длиной (не превышающей 900 байт);
  • содержит поля, которые принадлежат единой таблице.

Создание составных индексов целесообразно, когда:

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

Пример создания составного индекса:

CREATE INDEX test2_mm_idx ON test2 (major, minor);

Последовательность объявления столбцов индекса играет роль в решении СУБД задействовать индексы в SQL запросе или нет. Чтобы проверить очередность использования полей составного индекса, можно добавить оператор EXPLAIN перед скриптом запроса, который отобразит ход выполнения запроса. Пример:

EXPLAIN [ANALYSE] SELECT * FROM my_table WHERE field1 = 1 
AND field2 = 2 ORDER BY id LIMIT 100;

Отличным примером может служить телефонный справочник. Он сформирован по фамилии и имени, т.к. много людей имеют одинаковую фамилию. Следовательно, логично будет создать индекс одновременно и по фамилии, и по имени.
Наивысший приоритет в процессе сортировки принадлежит первым колонкам, описываемым в CREATE INDEX. Потому, в числе первых должны указываться колонки уникальные. Чтобы индекс был задействован при выборке данных в таблице, сам запрос обязательно должен ссылаться именно на колонку, указанную первой.
Использование составных индексов поможет увеличить производительность за счет того, что для выполнения поиска данных сервер будет сканировать только его, что поможет снизить в таблице число индексов.
Основные недостаки те же, что и у простых индексов - увеличение дискового пространства, замедление операций добавления, обновления и удаления данных.


Источники:
Составной ключ в SQL: определение, использование и примеры
Все, что необходимо знать про индексы MS SQL

Key Words for FKN + antitotal forum (CS VSU):