Задавайте вопросы, мы ответим
Вы не зашли.
Создаю тестовую таблицу:
Неактивен
Оптимизатор рассматривает гораздо больше параметров, чем кажется сначала; при 21 строке
безусловно гораздо быстрее прочитать все данные последовательно и отсортировать в памяти:
процессор работает быстро, а вот диск двигает головки медленно.
Более того, на таких узких данных быстрее оказывается читать последовательно даже большое
количество строк (потому что нужно сначала прочитать с диска индекс, который больше, чем
сами данные). Кажется, что оптимизатор начинает ошибаться с таким подходом только на 2 млн
строк:
[aquatica] root test > explain select * from test order by data;
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 524288 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------+
1 row in set (0,00 sec)
[aquatica] root test > explain select * from test force index (`data`) order by data;
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------+
| 1 | SIMPLE | test | index | NULL | DATA | 12 | NULL | 524288 | |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-------+
1 row in set (0,00 sec)
[aquatica] root test > \P cat >/dev/null
PAGER set to 'cat >/dev/null'
[aquatica] root test > select * from test order by data;
524288 rows in set (0,46 sec)
[aquatica] root test > select * from test force index (`data`) order by data;
524288 rows in set (0,98 sec)
-- добавить еще чуть-чуть строк
[aquatica] root test > explain select * from test order by data;
+----+-------------+-------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+---------+----------------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 2097152 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+---------+----------------+
1 row in set (0,00 sec)
[aquatica] root test > explain select * from test force index (data) order by data;
+----+-------------+-------+-------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | test | index | NULL | DATA | 12 | NULL | 2097152 | |
+----+-------------+-------+-------+---------------+------+---------+------+---------+-------+
1 row in set (0,00 sec)
[aquatica] root test > select * from test order by data;
2097152 rows in set (3,68 sec)
[aquatica] root test > select * from test force index (data) order by data;
2097152 rows in set (3,54 sec)
Неактивен