Уникальный индекс и стандартный индекс делаются отдельно? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть миграция таблицы ассоциации:

create_table :association_table do |t|
  t.belongs_to :table1, index: true, foreign_key: true
  t.belongs_to :table2, index: true, foreign_key: true
  t.datetime :deleted_at, index: true

  t.timestamps
end

add_index :association_table, [:table1_id, :table2_id], unique: true

Это создало пять индексов для этой конкретной таблицы.Учитывая, что я уже сделал уникальный индекс для тандемного столбца [:table1_id, :table2_id], все еще необходимо добавить отдельный индекс index: true для тех двух полей, для которых цель состоит в ускорении запроса?Или уникальный индекс сделает эту работу?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Установка uniq: true относится к индексу, где все строки индекса должны быть уникальными.То есть одна и та же строка может не иметь идентичных ненулевых значений для всех столбцов в этом индексе, как другая строка.Помимо того, что они используются для ускорения запросов, индексы UNIQUE могут использоваться для принудительного ограничения данных, поскольку система баз данных не допускает нарушения этого правила отдельных значений при вставке или обновлении данных.

Ваша система базы данныхможет разрешить применение индекса UNIQUE к столбцам, которые допускают значения NULL, и в этом случае две строки могут быть идентичными, если они обе содержат значение NULL (обоснование здесь заключается в том, что NULL считается не равным себе).Однако в зависимости от вашего приложения это может оказаться нежелательным: если вы хотите предотвратить это, вам следует запретить значения NULL в соответствующих столбцах.

Составные уникальные индексы создаются как,

add_index :association_table, [:table1_id, :table2_id], unique: true

, который будет выполнять более быстрые запросы, такие как

AssociationTable.where(table1_id: 34, table2_id: 54)

Примечание-1 Порядок столбцов в составном индексе имеет значение, поэтому AssociationTable.where(table2_id: 54, table1_id: 34) не выполняется быстрее

Примечание-2 Нет смысла хранить ваши table_id1 и table_id2 в отдельных индексах, если у вас также есть уникальный индекс обоих столбцов

0 голосов
/ 28 февраля 2019

Создание индекса по конкретному столбцу в таблице помогает ускорить результат запроса с условием для этого столбца.Пример: Индекс для одного столбца:

AssociationTable.where(:table1_id => 12)

В приведенном выше запросе индексирование по одному столбцу (table1_id) используется для быстрого извлечения результата.

Создание индекса по нескольким столбцам в таблице помогает вамбыстро получить результаты, если вы хотите фильтровать по этим столбцам.

Пример: индекс по нескольким столбцам:

AssociationTable.where(:table1_id => 12, :table2_id => 17)

В приведенном выше запросе индексирование по нескольким столбцам (table1_id, table2_id) используется для выборки результатабыстро.

Если вы хотите увидеть анализ запросов и индексацию.Инструменты доступны для всех клиентов баз данных, таких как анализатор запросов Mysql-Workbench и анализаторы запросов Postgres-PgAdmin.сверьтесь с ними, чтобы получить практические знания.

...