Почему MYSQL не использует индекс для того же запроса, если я запрашиваю больше столбцов? - PullRequest
0 голосов
/ 22 марта 2011

У меня есть следующая таблица:

create table stuff (
       id mediumint unsigned not null auto_increment primary key,
       title varchar(150) not null,
       link varchar(250) not null,
       time timestamp default current_timestamp not null,
       content varchar(1500)
);   

Если я ОБЪЯСНУЮ запрос

select id from stuff order by id;

тогда он говорит, что использует их первичный ключ в качестве индекса для упорядочения результатов. Но с этим запросом:

select id,title from stuff order by id;

EXPLAIN говорит, что нет возможных ключей, и обращается к файловой сортировке.

Почему это? Разве данные определенной строки не хранятся вместе в базе данных? Если он может упорядочить результаты с использованием индекса, когда я запрашиваю только идентификатор, то почему добавление другого столбца в запрос имеет значение? Первичный ключ уже идентифицирует строку, поэтому я думаю, что он должен использовать первичный ключ для упорядочивания и во втором случае.

Можете ли вы объяснить, почему это не так?

1 Ответ

2 голосов
/ 22 марта 2011

Конечно, потому что он более производительный в этом запросе: вам нужно прочитать полный индекс и после этого итеративно читать строку за строкой из данных. Это крайне неэффективно. Вместо этого mysql просто предпочитает читать данные прямо из файла данных.

Кроме того, какой тип хранилища вы используете? Похоже на mysam.

В этом случае innodb будет более эффективным, поскольку он использует кластеризованные индексы по первичному ключу (который монотонно растет в вашем случае).

...