Новостной раздел для чайников: индекс
Азат Разетдинов 24.08.2006 15:10
/ 24.08.2006 15:11
Возьмём результирующий SQL-запрос из "
Новостного раздела для чайников" для вывода списка статей за определённый месяц:
SELECT
article_id AS id,
title,
lead,
dt
FROM
article
WHERE
article_type_id = 1 AND
is_published = 1 AND
dt_published <= now()
AND dt >= '2006-08-00' AND dt <= '2006-08-31'
ORDER BY
dt DESC
...и заглянем в EXPLAIN. Вроде бы, всё в порядке, индекс используется. Но почему значение rows почти равно количеству всех записей в таблице, а не количеству новостей за последний месяц?
Просвещаемся и понимаем, что из-за dt_published <= now() условие dt >= '2006-08-00' просто-напросто игнорируется индексом и применяется
после, что не есть хорошо.
Если выкинуть из индекса столбец dt_published (много ли у нас новостей, запланированных на будущее?), ситуация намного улучшается: с помощью индекса выбираются все статьи за месяц, и к ним применяется dt_published <= now().
Но совсем отказаться от dt_published в индексе нельзя, он используется в запросе для вывода календаря.
Выход: разбить описанный в статье индекс на два: (article_type_id,is_published,dt_published) и (article_type_id,is_published,dt) и помнить, что в многостолбцовых индексах необходимо очень осторожно использовать интервальные условия на значения разных столбцов.
- Новостной раздел для чайников: индекс, Азат Разетдинов [M] 24.08.2006 15:10 / 24.08.2006 15:11
- спасибо (-), Misha v.3 [M] 24.08.2006 16:41