SeaGull
Junior Member
Explain --> possible_keys --> rows
День добрый.
MySQL Server version: 5.0.24a
Занялся экспериментами с оптимизацией баз на сайте и наткнулся на совершенно непонятные мне результаты от EXPLAIN.
Имеется Гостевая книга:
В поле "moderated" хранится информация о том, кто и когда удалил сообщение.
Соответсвенно, пользователям видны только "не удаленные" сообщения, т.е. те, для которых поле "moderated" пустое.
select count(*) from GuestBook;
167745
select count(*) from GuestBook where moderated = '';
163467
select count(*) from GuestBook where moderated != '';
4278
explain select count(*) from GuestBook where moderated='';
Далее завожу индекс и начинается "странное"...
alter table GuestBook add INDEX (moderated);
Query OK, 167745 rows affected (17.80 sec)
explain select count(*) from GuestBook where moderated='';
alter table GuestBook drop INDEX moderated;
Query OK, 167745 rows affected (8.38 sec)
alter table GuestBook add INDEX (moderated(1));
Query OK, 167745 rows affected (8.40 sec)
explain select count(*) from GuestBook where moderated='';
Кто разбирается, подскажите пожалуйста:
1. Почему во 2-ом EXPLAIN поле rows = 144389, а не 163467 (см. 2-ой SELECT) ?
2. Почему в 3-ем EXPLAIN не используется индекс ?
3. Почему в 3-ем EXPLAIN поле rows меньше общего числа записей базы, хотя индекс не используется ?
4. Какой из результатов, согласно EXPLAIN, следует считать лучше оптимизированным ?
День добрый.
MySQL Server version: 5.0.24a
Занялся экспериментами с оптимизацией баз на сайте и наткнулся на совершенно непонятные мне результаты от EXPLAIN.
Имеется Гостевая книга:
Код:
CREATE TABLE `GuestBook` (
`id` mediumint(8) unsigned NOT NULL default '0',
`login` char(20) NOT NULL default '',
`text` text NOT NULL,
`date` datetime default NULL,
`moderated` char(50) NOT NULL default ''
) ENGINE=MyISAM
Соответсвенно, пользователям видны только "не удаленные" сообщения, т.е. те, для которых поле "moderated" пустое.
select count(*) from GuestBook;
167745
select count(*) from GuestBook where moderated = '';
163467
select count(*) from GuestBook where moderated != '';
4278
explain select count(*) from GuestBook where moderated='';
Код:
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | GuestBook | ALL | NULL | NULL | NULL | NULL | 167745 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
alter table GuestBook add INDEX (moderated);
Query OK, 167745 rows affected (17.80 sec)
explain select count(*) from GuestBook where moderated='';
Код:
+----+-------------+-----------+------+---------------+-----------+---------+-------+--------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+-----------+---------+-------+--------+--------------------------+
| 1 | SIMPLE | GuestBook | ref | moderated | moderated | 50 | const | 144389 | Using where; Using index |
+----+-------------+-----------+------+---------------+-----------+---------+-------+--------+--------------------------+
Query OK, 167745 rows affected (8.38 sec)
alter table GuestBook add INDEX (moderated(1));
Query OK, 167745 rows affected (8.40 sec)
explain select count(*) from GuestBook where moderated='';
Код:
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | GuestBook | ALL | moderated | NULL | NULL | NULL | 125809 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+
1. Почему во 2-ом EXPLAIN поле rows = 144389, а не 163467 (см. 2-ой SELECT) ?
2. Почему в 3-ем EXPLAIN не используется индекс ?
3. Почему в 3-ем EXPLAIN поле rows меньше общего числа записей базы, хотя индекс не используется ?
4. Какой из результатов, согласно EXPLAIN, следует считать лучше оптимизированным ?