Почему оптимизатор Mysql выбирает вторичный индекс при выполнении операции «выбор * из поиска» без указания порядка по словам.
Это просто случайность или это негласная оптимизация, предполагаемая с момента добавления вамивторичный индекс важнее первичного ключа.
Я ожидаю, что результаты будут упорядочены по первичному ключу, так как сканирование всех конечных узлов может предоставить все данные, необходимые для ответа на этот запрос.
Для воспроизведения я создаю простую таблицу пар ключ / значение (примечание не auto_increment)
create table lookup (
id int not null,
primary key (id),
name varchar(25),
unique k_name (name)
) engine=innodb;
Вставка некоторых данных в случайном не алфавитном порядке
insert into lookup values(1, "Zebra"),(2, "Aardvark"),(3, "Fish"),(4,"Dog"),(5,"Cat"),(6,"Mouse");
Запрос данных (именно здесь я ожидаю, что данные будут возвращены в порядке первичного ключа)
mysql> select * from lookup;
+----+----------+
| id | name |
+----+----------+
| 2 | Aardvark |
| 5 | Cat |
| 4 | Dog |
| 3 | Fish |
| 6 | Mouse |
| 1 | Zebra |
+----+----------+
6 rows in set (0.00 sec)
Где, как это не так - кажется, что сканирование конечных узлов k_name было выполнено.Показанный здесь
mysql> explain select * from lookup;
+----+-------------+--------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+--------+---------+------+------+-------------+
| 1 | SIMPLE | lookup | index | NULL | k_name | 28 | NULL | 6 | Using index |
+----+-------------+--------+-------+---------------+--------+---------+------+------+-------------+
1 row in set (0.00 sec)
Для меня это говорит, что Mysql использует k_name в качестве индекса покрытия для возврата данных.Если я опускаю индекс k_name, тогда данные возвращаются в порядке первичного ключа.При добавлении еще одного неиндексированного столбца данные возвращаются в порядке первичного ключа.
Некоторая базовая информация о моей настройке.
mysql> show table status like 'lookup'\G
*************************** 1. row ***************************
Name: lookup
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 6
Avg_row_length: 2730
Data_length: 16384
Max_data_length: 0
Index_length: 16384
Data_free: 0
Auto_increment: NULL
Create_time: 2011-11-15 10:42:35
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.15-log |
+------------+
1 row in set (0.00 sec)