SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 26.02.2010 00:05:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Формат выдаваемой EXPLAIN EXTENDED информации

Что показывает поле filtered при использовании EXPLAIN EXTENDED?
В доке не нашел ничего, и методом "тыка" тоже не понимаю.

Неактивен

 

#2 26.02.2010 00:13:31

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

Re: Формат выдаваемой EXPLAIN EXTENDED информации

filtered

The filtered column indicates an estimated percentage of table rows that will be filtered by the table condition. That is, rows shows the estimated number of rows examined and rows × filtered / 100 shows the number of rows that will be joined with previous tables. This column is displayed if you use EXPLAIN EXTENDED. (New in MySQL 5.1.12)

А вот сможешь ли ты придумать случай, когда там не 100%? smile

Неактивен

 

#3 27.02.2010 08:10:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Формат выдаваемой EXPLAIN EXTENDED информации

Да. Искать в документации 5.0 то, что говорит сервер 5.1 roll

paulus написал:

А вот сможешь ли ты придумать случай, когда там не 100%? smile

Если не рассматривать случаи типа WHERE id<0, где id автоинкремент, то


test >show create table a_test;

| a_test | CREATE TABLE `a_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `c2` (`c2`)
) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 |

test >select * from a_test;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  2 |   63 |  810 |  803 |
|  3 |   28 | 4658 | 4653 |
|  4 |   54 | 9945 | 9944 |
|  5 |   98 | 4655 | 4654 |
|  6 |   46 | 4660 | 4659 |
|  7 |   56 | 6624 | 6623 |
|  8 |   85 | 2849 | 2845 |
|  9 |   89 | 3796 | 3788 |
| 10 |   40 | 2524 | 2517 |
| 11 |   90 | 3147 | 3146 |
| 12 |   11 | 4798 | 4793 |
| 13 |   67 | 5200 | 5198 |
| 14 |   87 | 8324 | 8318 |
| 15 |   38 | 9161 | 9160 |
| 16 |   61 | 2454 | 2445 |
| 17 |   30 | 2473 | 2473 |
| 18 |   90 | 4647 | 4643 |
| 19 |   86 | 9474 | 9473 |
| 20 |   50 | 7032 | 7028 |
| 21 |   36 | 3488 | 3481 |
+----+------+------+------+
20 rows in set (0.00 sec)

test >explain extended select * from a_test where c2>3000;
+----+-------------+--------+------+---------------+------+---------+------+------+--------
--+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | filtere
d | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+------+--------
--+-------------+
|  1 | SIMPLE      | a_test | ALL  | c2            | NULL | NULL    | NULL |   20 |    75.0
0 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+------+--------
--+-------------+
1 row in set, 1 warning (0.00 sec)
 

Если указать force index(c2), то будет 100. Если постепенно увеличивать значение c2, то он будет уменьшать значение filtered до тех пор пока условию не будет удовлетворять меньше 30% строк таблицы, тогда с полного скана он переходит на использование индекса и показывает 100%, но при этом показывает точное кол-во выбранных строк.

test >explain extended select * from a_test where c2>7032;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------
---+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows | filter
ed | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------
---+-------------+
|  1 | SIMPLE      | a_test | range | c2            | c2   | 5       | NULL |    5 |   100.
00 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------
---+-------------+
1 row in set, 1 warning (0.00 sec)


Полезно бывает писать на форуме, пока отвечал почти разобрался smile
Не понятно только почему при использовании неидексной колонки он всегда показывает 100%. Ведь в этом случае сервер не владеет информацией о том какой процент строк будет удовлетворять условию, логично было бы писать null.

А в случае WHERE id<0 (где id автоинкремент) он пишет null, хотя из определения таблицы точно известно, что будет выбрано 0 строк.

Неактивен

 

Board footer

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