Первичный ключ по определению уникален : он идентифицирует каждую отдельную строку. Вам всегда нужен первичный ключ в вашей таблице, так как это единственный способ идентифицировать строки.
Индекс - это в основном словарь для поля или набора полей. Когда вы просите базу данных найти запись, где какое-либо поле равно некоторому конкретному значению, она может заглянуть в словарь (индекс), чтобы найти нужные строки. Это очень быстро, потому что, как и в словаре, записи сортируются в индексе, что позволяет выполнять двоичный поиск. Без индекса база данных должна прочитать каждую строку в таблице и проверить значение.
Как правило, вы хотите добавить индекс для каждого столбца, по которому нужно выполнить фильтрацию. Если вы выполняете поиск по определенной комбинации столбцов, вы можете создать единый индекс, содержащий все эти столбцы. Если вы сделаете это, тот же индекс можно использовать для поиска любого префикса в списке столбцов в вашем индексе. Проще говоря (если немного неточно), словарь содержит записи, состоящие из конкатенации значений, используемых в столбцах, в указанном порядке, поэтому база данных может искать записи, которые начинаются с определенного значения и все еще используют эффективный двоичный поиск для это.
Например, если у вас есть индекс по столбцам (A, B, C), этот индекс можно использовать, даже если вы фильтруете только по A, потому что это первый столбец в индексе. Точно так же его можно использовать, если вы фильтруете по A и B. Однако его нельзя использовать, если вы фильтруете только по B или C, потому что они не являются префиксом в списке столбцов - вам нужен другой индекс, чтобы приспособиться к этому. .
Первичный ключ также служит индексом, поэтому вам не нужно добавлять индекс, объединяющий те же столбцы, что и ваш первичный ключ.