У меня есть материализованная доска объявлений с управляемым движением. Для получения сообщений по порядку используется следующий запрос:
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`)
)
Основная проблема с запросом - разбиение на страницы - мне нужно запустить вторую страницу прямо из сообщения рядом с последним на предыдущей странице. Вот почему я хочу это прямолинейно - без сублектов и прочее.
Текущая настройка не совсем приятна, поскольку она запускает вторую страницу из середины потока, но это, по крайней мере, логично.