В документации CRDB для вторичных индексов четко указано, что порядок столбцов имеет значение:
Столбцы с более высокой мощностью (большим числом различных значений) следует помещать в индекс перед столбцами с меньшей мощностью. Если количество столбцов, которые вы хотите добавить в индекс, одинаковое, протестируйте несколько вариантов расположения столбцов в непроизводственной среде, чтобы определить наиболее эффективное расположение.
Применяется ли это руководство также к составлению многостолбцовых первичных ключей?
Да, я бы так подумал. IIUC, основным моментом создания хорошего многостолбцового первичного ключа в CRDB является обеспечение того, чтобы префикс первичного ключа был достаточно уникальным, чтобы данные были распределены «достаточно равномерно». Я считаю, что это то, что пытаются понять документы здесь (https://www.cockroachlabs.com/docs/v23.2/ Performance-best-practices-overview#use-multi-column-primary-keys). ниже:
Под «достаточной случайностью» мы подразумеваем, что префикс первичного ключа должен быть относительно равномерно распределен по его домену. В его домене должно быть как минимум столько же элементов, сколько у вас узлов.
Предостережение заключается в том, что это не похоже на то, что упорядочение ПК с несколькими столбцами по мощности является «единственным правилом» для построения лучшего ПК с несколькими столбцами - если вы об этом спрашиваете.
Из любопытства мы также можем проверить эту теорию, выполнив что-то вроде:
CREATE TABLE t (low BOOLEAN NOT NULL, very_high UUID DEFAULT gen_random_uuid() NOT NULL);
INSERT INTO t (low)
SELECT i % 2 = 0
FROM generate_series(1, 10000) AS s(i);
Следуя первому правилу более высокой мощности:
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (very_high, low);
Не соблюдение правила:
ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (low, very_high);
Я думаю, что должно примерно это продемонстрировать? Не уверен, какая величина строк будет лучше всего представлена.