SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.07.2009 11:51:10

incer
Участник
Зарегистрирован: 04.07.2009
Сообщений: 1

как пользоваться EXPLAIN ?

Создаю тестовую таблицу:


CREATE TABLE  `test` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data` CHAR( 12 ) NOT NULL ,
INDEX ( `data` )
) ENGINE = MYISAM ;


Делаю запрос:
EXPLAIN SELECT * FROM `test` ORDER BY `data`


Получаю:

id                     1
select_type       SIMPLE
table                test
type                 ALL
possible_keys   NULL
key                  NULL
key_len            NULL
ref                   NULL
rows                21
Extra               Using filesort


Не понимаю,  почему possible_keys и key не заданы. Разве индекс по полю `data` не будет использоваться при запросе?

Неактивен

 

#2 06.07.2009 11:26:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: как пользоваться EXPLAIN ?

Оптимизатор рассматривает гораздо больше параметров, чем кажется сначала; при 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)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson