Достаточно ли индексов из составных ключей?

4

Вот как выглядит моя таблица:

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) только для поля страницы?

  • 1
    В любом составном индексе он может быть использован, если ваш запрос использует n крайних левых столбцов (где n находится между 1 и числом столбцов в вашем индексе). В вашем случае, если ваш запрос использует name или name и page он может быть использован - если ваш запрос только на page , этот составной индекс определенно бесполезен
Теги:
performance
indexing
composite-key

3 ответа

3
Лучший ответ

Подумайте о составном индексе в качестве телефонной книги. Телефонная книга сортируется по фамилии, а затем по имени. Если вам дано имя Боб Смит, вы можете быстро найти раздел S, затем Sm, затем весь Смит, а затем Боб. Это быстро, потому что у вас есть оба ключа в индексе. Поскольку книга организована по фамилии во-первых, было бы также тривиально найти все записи Смита.

Теперь представьте, что вы пытаетесь найти всех людей по имени Боб во всей телефонной книге. Гораздо сложнее, верно?

Это аналогично тому, как индекс на диске также организован. Поиск всех строк с определенным столбцом страницы, когда список отсортированных в порядке (name, page) в основном приведет к последовательной проверке всех строк, глядя один за другим на все, что имеет эту страницу.

Для получения дополнительной информации о том, как работают индексы, я рекомендую прочитать Использовать Index, Luke.

6

Как указано, вам понадобится ваш другой индекс myidx, потому что ваш индекс UNIQUE сначала указывает name. Другими словами, его можно использовать для запроса:

  • name
  • name и page
  • Но не только page.

Другой вариант - изменить порядок индекса UNIQUE и поместить столбец page. Затем он может использоваться только для page только запросов, но станет несовместимым с name только запросами.

2

Вам нужно проанализировать запрос (ы), который будет использовать эту таблицу, и определить, какие поля будет использоваться для сортировки результатов. Вы должны индексировать поля, которые используются для большей сортировки.

  • 0
    Для сортировки я могу использовать w и h которых нет индексов: / Если то, что вы говорите, правильно, мне нужно добавить индексы для всех полей в моей таблице.
  • 0
    Майк Кристенсен говорит то, что я хотел сказать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню