При поиске только по одному первичному ключу в составной таблице первичных ключей поведение Spanner отличается. Например, если таблица имеет ColA и ColB в качестве первичного ключа (упоминается в том же порядке при определении первичного ключа). Если вы ищете по первому ключу select * from table where ColA = 'dfdf'
, то он сканирует несколько строк и выдает результат намного быстрее ~ 10 мс. Но если вы ищете по второму ключу select * from table where ColB = 'dfdf'
, то он выполняет полное сканирование таблицы. Почему это несоответствие, если мы не ищем по полному ключу, тогда он должен выполнять полное сканирование таблицы или отдельных строк. первичные ключи индексируются, поэтому никогда не следует переходить к полному сканированию таблицы.
Составной ключ - это не 2 отдельных ключа, а один ключ, объединенный из 2 частей...
Представьте себе список слов, отсортированных по алфавиту... Найти слова, первая буква которых - Н, легко... Но как найти все слова, у которых второй буква "H"...
Единственный способ — выполнить полное сканирование всех слов, если нет второго индекса слов по их второй букве, для чего и нужны вторичные индексы.
Составной индекс первичного ключа всегда упорядочен по ключам. т.е. если у вас есть ключи: [ColA,ColB], вы можете искать по ColA и только потом по ColB. Вы не можете использовать его для поиска только по ColB, для этого потребуется полное сканирование таблицы. Если вы хотите искать по ColB без ColA, вам следует использовать вторичный индекс.