Должен ли я создать индекс булевого поля при многоколоночной индексации? - PullRequest
0 голосов
/ 16 апреля 2020

Например, я хочу получить следующий / предыдущий пост по publish_date и published=True. Должен ли я создать индекс publish_date, published или просто publish_date?

Таблица:

id (int) 
title (char) 
description (text) 
publish_date (datetime) 
published (bool)

Запрос:

select * 
from table 
where publish_date > current_post.publish_date 
  and published = True
order by publish_date
limit 1

Какая индексация будет лучше?

  • Многостолбцовая индексация при (publish_time, published)

или

  • Индексирование по одному столбцу всего (publish_time)

1 Ответ

0 голосов
/ 17 апреля 2020

Позвольте мне сначала переписать запрос, чтобы он имел больше смысла:

select * from table 
    where publish_date >= '2020-01-01'
      and published = True
    ORDER BY publish_date
    LIMIT 1

Этот индекс будет оптимальным:

INDEX(published, publish_date)

со столбцами в этом порядке. Сначала идут вещи, протестированные с =, затем не более одного диапазона. Оба столбца будут использоваться в WHERE. И, поскольку он обрабатывает весь WHERE, он перейдет к ORDER BY. ORDER BY совпадает с WHERE достаточно хорошо, чтобы помочь с ним, избегая, таким образом, какого-либо рода.

Дополнительные обсуждения: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

См. Также EXPLAIN SELECT ...

Количество элементов каждого столбца не имеет значения, когда он является частью составного индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...