Добрый день.
Не знаю, не могу разобраться с глупой проблемой. Почему не используется индех при элементарной выборке?
Структура таблицы:
Цитата |
CREATE TABLE `sc_webdata_main` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `domain` varchar(150) NOT NULL, `idn` varchar(150) NOT NULL, `md5domain` varchar(32) NOT NULL, `added_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `price` decimal(30,2) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `ix_md5domain` (`md5domain`), KEY `ix_added` (`added_at`), KEY `ix_price` (`price`) ) ENGINE=InnoDB AUTO_INCREMENT=10999 DEFAULT CHARSET=utf8 |
explain select * from sc_webdata_main order by price desc limit 300, 10;
+----+-------------+-----------------+------+---------------+------+---------+------+-------+-------- --------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+---------------+------+---------+------+-------+------- ---------+
| 1 | SIMPLE | sc_webdata_main | ALL | NULL | NULL | NULL | NULL | 11184 | Using filesort |
+----+-------------+-----------------+------+---------------+------+---------+------+-------+------- ---------+
explain select * from sc_webdata_main force index (ix_price) order by price desc limit 3000, 1
+----+-------------+-----------------+-------+---------------+----------+---------+------+------+---- ---+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+-------+---------------+----------+---------+------+------+--- ----+
| 1 | SIMPLE | sc_webdata_main | index | NULL | ix_price | 14 | NULL | 3010 | |
+----+-------------+-----------------+-------+---------------+----------+---------+------+------+--- ----+
Цитата |
ПО умолчанию, Mysql, за редким исключением, очень тупо применяет(или не применяет) индекс к сортируемым полям. |
Цитата (forza @ 11.12.2014 - 19:08) |
Если offset будет стоять 1 миллион, то он сначала переберет 1 миллион записей, а потом вернет 10 требуемых? Нельзя ли как-то оптимизировать этот процесс? |
select * from sc_webdata_main
where price < 1436.78
order by price desc limit 1
select * from sc_webdata_main
where price < (select price from sc_webdata_main order by price desc limit 3000, 1)
order by price desc limit 1