2015-11-05 7 views
1

Предположим, у меня есть таблица t1 с тремя столбцами A, B, C, где (A, B) содержат уникальный ключ (с сотнями тысяч строк). Поскольку 90% запросов будут иметь форму SELECT C FROM t1 WHERE A =? и B =?, я полагаю, что хочу иметь индекс покрытия для A, B и C.sqlite: уникальный индекс покрытия

Как получить индекс покрытия, который включает C, и определяет (A, B) как уникальный?

Я имею в виду наличие двух индексов: одного уникального и одного покрытия и использования INDEXED BY, чтобы заставить индекс покрытия для SELECTS.

Разве это разумно?

ответ

1

В SQLite 3.8.2 или более поздней версии, вы можете сделать эту таблицу WITHOUT ROWID table, так что сама таблица ведет себя как индекс сопроводительным:

CREATE TABLE t1 (
    A, 
    B, 
    C, 
    PRIMARY KEY (A, B) 
) WITHOUT ROWID; 
1

Да, это разумно.

Однако, прежде чем вы это сделаете, я рекомендую вам попробовать перенести первичный ключ на A и B и снова попробовать ваш запрос. Посмотрите, есть ли прирост производительности. Если нет выигрыша, вы можете попытаться обеспечить уникальность с помощью create unique index idx_t1_ab on t1(a,b). Затем создать индекс A, B и C.

Смежные вопросы