У меня есть материализованный бюллетень, управляемый путем -. доска. Для упорядочивания сообщений используется следующий запрос:
SELECT * FROM Board ORDER by root DESC, path ASC LIMIT 0,100
, где root
— это id
корневого сообщения для потока, а path
— это материализованный путь.
Однако ни одна из моих попыток заставить этот запрос использовать индексы не увенчалась успехом.
mysql> explain extended select path from Board order by root desc, path asc limit 100;
+-------+---------------+----------+---------+------+-------+----------+----------------------------+
| type | possible_keys | key | key_len | ref | rows | filtered | Extra
+-------+---------------+----------+---------+------+-------+----------+-----------------------------
| index | NULL | rootpath | 261 | NULL | 21998 | 100.00 | Using index; Using filesort
На данный момент он показывает количество всех строк в таблице в столбце rows
. Мне интересно, есть ли способ уменьшить это число или оптимизировать запрос каким-либо другим способом?
CREATE TABLE `Board` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`path` varchar(255) NOT NULL DEFAULT '0',
`root` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `root` (`root`),
KEY `path` (`path`),
KEY `rootpath` (`root`,`path`)
)
Основная проблема с запросом — разбиение на страницы. -Мне нужно начать вторую страницу прямо с сообщения, следующего за последним на предыдущей странице. Вот почему я хочу прямого пути -без сублектов и прочего.
Хотя текущая настройка не совсем приятна, так как начинается вторая страница с середины ветки, но, по крайней мере, вполне логична.