Помогите разобраться в индексах

gRigoriy

Новичок
Помогите разобраться в индексах

Прочитал много инфы, в том числе последни phpinside, но как то ясности в вопросе использовании индексов нет =(. Собственно поставила в тупик ситуация:

Есть таблица tbl1 (10651 строк), в ней хранится список компаний.
[sql]
CREATE TABLE `tbl1` (
`id` int(11) NOT NULL auto_increment,
........
`company` varchar(255) NOT NULL default '',
`url` varchar(255) NOT NULL default '',
.........
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`,`url`)
);[/sql]

И запрос на вывод 10 последних записей... [sql]SELECT `url`,`company` FROM `tbl1` ORDER by `id` DESC LIMIT 10;[/sql]
На что EXPLAIN отвечает
Код:
| table        | type   | possible_keys | key             | key_len | ref        | rows  | Extra |
        tbl1    | index | NULL                | PRIMARY |       4        | NULL | 10651
Что, как я понимаю, свидетельствует о том, что для того чтобы вывести 10 последних записей MySQL просматривает всю таблицу?! Хотя, как я думал, должна была просмотреть PRIMARY KEY. В чем же причина такого поведения? И как все, ж таки, в данном случае вывести 10 последних записей, опираясь на информацию из индекса? Точнее даже - как уменьшить количество просматриваемых ячеек?

И второе: может кто нибудь знает хорошую доку на русском по применению индексов (кроме мана mysql)?
 

gRigoriy

Новичок
Не приметил =). Эм, а если mysql просматривает индекс, то почему весь? Ведь мне нужны только последние 10 записей, мне, опять же казалось, что индекс это упорядоченная структура, и если все настроено правильно, то по достижении определенного условия (к примеру LIMIT 10) просмотр заканчивается. Ведь просмотр 10 записей индекса и 10000 это разные вещи... Или я опять заблуждаюсь?
 

gRigoriy

Новичок
Понял, что ничего не понял =). Мой английский совсем плохой. Вроде бы я и прав (если правильно понял =)), что по достижению limit rows_count mysql не сканирует дальше, но почему explain написал 10000 строк вместо 10?! Опять же из того что понял - explain указывает примерное количество строк, но не до такой же степени?!

В принцыпе спасибо за помощь - буду учить английский может прийдет просветление =). А до этого момента хочу спросить - не знаете ли вы материалы на русском про оптимизацию mysql (весь интернет забит растиражированой статьей с detail.phpclub.ru, но она слишком общая). А еще лучше, если бы подсказали где искать русский мануал по MySQL 4.1-5.1, если такой есть в природе...
 

Апельсин

Оранжевое создание
> Вроде бы я и прав (если правильно понял =)), что по достижению limit rows_count mysql не сканирует дальше, но почему explain написал 10000 строк вместо 10?! Опять же из того что понял - explain указывает примерное количество строк, но не до такой же степени?!

В твоем случае нет full table scan. Он использует индекс для сортировки. Т.к. никакого ограничивающего условия в WHERE у тебя нет то указаны все записи.

> русский мануал по MySQL 4.1-5.1, если такой есть в природе...

его в природе нет. Мануал переводился на русский язык для версии 4.0.12 и это было много лет назад. С тех пор он не обновлялся и новых официальных переводов не было.
 

andry

Новичок
Если разбираться в explain, то там далеко не каждому слову можно верить. Он, так сказать, дает общую информацию, из которой можно делать выводы.
 

gRigoriy

Новичок
Апельсин, гранд мерси, что то подобное блуждало в моем воспаленном мозгу =). И про ман тоже - скорблю... Буду учить английский =)

andry, это я тоже подозревал, спасибо...
 
Сверху