В документации MySQL, описывающей использование расширений индекса , в качестве примера приводится следующая таблица, за которой следует следующий запрос:
CREATE TABLE t1 (
i1 INT NOT NULL DEFAULT 0,
i2 INT NOT NULL DEFAULT 0,
d DATE DEFAULT NULL,
PRIMARY KEY (i1, i2),
INDEX k_d (d)
) ENGINE = InnoDB;
SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01';
InnoDB внутренне преобразует индекс k_d
для включения первичного ключа в конце. То есть фактический индекс k_d
будет на (d, i1, i2)
, три столбца.
Документация объясняет это (выделение мое):
Оптимизатор не может использовать первичный ключ в этом случае, поскольку он содержит столбцы (i1, i2) и запрос не ссылается на i2. Вместо этого оптимизатор может использовать вторичный индекс k_d для (d), и план выполнения зависит от того, используется ли расширенный индекс.
Я смущен приведенным выше утверждением. Сначала говорится, что i1
недостаточно , чтобы использовать индекс первичного ключа из двух столбцов (i1, i2)
. Затем во втором предложении говорится, что индекс k_d
для (d, i1, i2)
может использоваться , несмотря на то, что используются только d
и i1
, а i2
отсутствует.
Мое общее понимание индексов в MySQL и других разновидностях SQL состоит в том, что можно использовать левую часть индекса, если присутствует подмножество всех столбцов в индексе, начиная с левой.
Чем отличается индекс первичного ключа (кластеризованный) и некластеризованный вторичный индекс, который позволяет последнему использовать частичный индекс, но первый не может?