parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Новостной раздел для чайников: индекс

Азат Разетдинов 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