Вот как выглядит моя таблица:
CREATE TABLE pics(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
page INTEGER,
w INTEGER,
h INTEGER,
FOREIGN KEY(page) REFERENCES pages(id) ON DELETE CASCADE,
UNIQUE(name, page)
);
CREATE INDEX "myidx" ON "pics"("page"); # is this needed?
поэтому UNIQUE(name, page)
должен создать индекс. Но достаточно ли этого индекса, чтобы делать быстрые запросы, содержащие только поле page
? Как выбор набора "pics" WHERE page = ?
. или JOIN pages.id ON pics.page
? Или мне нужно создать другой индекс (myidx) только для поля страницы?
Подумайте о составном индексе в качестве телефонной книги. Телефонная книга сортируется по фамилии, а затем по имени. Если вам дано имя Боб Смит, вы можете быстро найти раздел S, затем Sm, затем весь Смит, а затем Боб. Это быстро, потому что у вас есть оба ключа в индексе. Поскольку книга организована по фамилии во-первых, было бы также тривиально найти все записи Смита.
Теперь представьте, что вы пытаетесь найти всех людей по имени Боб во всей телефонной книге. Гораздо сложнее, верно?
Это аналогично тому, как индекс на диске также организован. Поиск всех строк с определенным столбцом страницы, когда список отсортированных в порядке (name, page)
в основном приведет к последовательной проверке всех строк, глядя один за другим на все, что имеет эту страницу.
Для получения дополнительной информации о том, как работают индексы, я рекомендую прочитать Использовать Index, Luke.
Как указано, вам понадобится ваш другой индекс myidx
, потому что ваш индекс UNIQUE
сначала указывает name
. Другими словами, его можно использовать для запроса:
name
name
и page
page
.Другой вариант - изменить порядок индекса UNIQUE
и поместить столбец page
. Затем он может использоваться только для page
только запросов, но станет несовместимым с name
только запросами.
Вам нужно проанализировать запрос (ы), который будет использовать эту таблицу, и определить, какие поля будет использоваться для сортировки результатов. Вы должны индексировать поля, которые используются для большей сортировки.
w
и h
которых нет индексов: / Если то, что вы говорите, правильно, мне нужно добавить индексы для всех полей в моей таблице.
name
илиname
иpage
он может быть использован - если ваш запрос только наpage
, этот составной индекс определенно бесполезен