Какую версию MySQL вы используете?Вот тест, который я провел на Percona Server 5.5.16:
mysql> create table table_users (
id int auto_increment primary key,
fullname char(20),
username char(20),
unique key (fullname)
);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into table_users values (default, 'billk', 'billk');
Query OK, 1 row affected (0.00 sec)
mysql> explain select * from table_users where fullname='billk'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: table_users
type: const
possible_keys: fullname
key: fullname
key_len: 21
ref: const
rows: 1
Extra:
1 row in set (0.00 sec)
Это показывает, что он использует индекс полного имени, просматривая постоянное значение, но это не только запрос индекса.
mysql> explain select fullname from table_users where fullname='billk'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: table_users
type: const
possible_keys: fullname
key: fullname
key_len: 21
ref: const
rows: 1
Extra: Using index
1 row in set (0.00 sec)
Как и ожидалось, он может получить столбец полного имени из индекса полного имени, так что это запрос только для индекса.
mysql> explain select id from table_users where fullname='billk'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: table_users
type: const
possible_keys: fullname
key: fullname
key_len: 21
ref: const
rows: 1
Extra: Using index
1 row in set (0.00 sec)
Поиск по полному имени, но выбор первичного ключа такжезапрос только для индекса, потому что конечные узлы вторичных индексов InnoDB (например, уникальный ключ) неявно содержат значение первичного ключа.Таким образом, этот запрос может пройти BTREE для полного имени, и в качестве бонуса он также получает идентификатор.
mysql> explain select fullname, username from table_users where fullname='billk'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: table_users
type: const
possible_keys: fullname
key: fullname
key_len: 21
ref: const
rows: 1
Extra:
1 row in set (0.00 sec)
Как только список выбора включает в себя любой столбец, который не является частью индекса, он можетбольше не будет запрос только для индекса.Сначала он ищет в BTREE полное имя, чтобы найти значение первичного ключа.Затем он использует это значение идентификатора, чтобы пройти BTREE для кластеризованного индекса, как InnoDB хранит всю таблицу.Там он находит другие столбцы для данной строки, включая имя пользователя.