Да. Искать в документации 5.0 то, что говорит сервер 5.1
paulus написал:
А вот сможешь ли ты придумать случай, когда там не 100%?
Если не рассматривать случаи типа 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)
Полезно бывает писать на форуме, пока отвечал почти разобрался
Не понятно только почему при использовании неидексной колонки он всегда показывает 100%. Ведь в этом случае сервер не владеет информацией о том какой процент строк будет удовлетворять условию, логично было бы писать null.
А в случае WHERE id<0 (где id автоинкремент) он пишет null, хотя из определения таблицы точно известно, что будет выбрано 0 строк.