







|
MySQL.RU - Webboard
Вернуться
Использование индекса .... (Dmitriy) 26/04/2012 - 09:34:54
Re: Использование индекса .... (Akina) 26/04/2012 - 12:18:01
Re: Использование индекса .... (Dmitriy) 26/04/2012 - 17:12:18
Re: Использование индекса .... (Akina) 26/04/2012 - 21:24:31
> Original message text:
> From: Dmitriy - 26/04/2012 - 09:34:54
> Subject:Использование индекса ....
> -----------------
> Часу доброгу, уважаемые. Столкнулся с интересной дилемой...
>
> есть таблица:
> CREATE TABLE `events` (
> `parent_id` int(11) NOT NULL,
> `ds` date NOT NULL DEFAULT '0000-00-00',
> `de` date NOT NULL DEFAULT '0000-00-00',
> `ts` time NOT NULL DEFAULT '00:00:00',
> `te` time NOT NULL DEFAULT '23:59:59',
> `days` varchar(15) DEFAULT NULL,
> PRIMARY KEY (`parent_id`,`ds`,`de`,`ts`,`te`),
> KEY `ds` (`ds`,`de`,`ts`,`te`,`days`),
> KEY `ts` (`ts`,`te`),
> KEY `days` (`days`)
> ) ENGINE=MyISAM DEFAULT CHARSET=utf8
>
> казалось бы что запрос типа:select * from events where ds >= now();
> будет использовать ключи, но explain опровергает ожидаемое ...
> explain select * from events where ds >= now();
> +----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
> | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
> +----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
> | 1 | SIMPLE | events | ALL | ds | NULL | NULL | NULL | 99661 | Using where |
> +----+-------------+--------+------+---------------+------+---------+------+-------+-------------+
>
>
> самое интересное и мне не понятное, почему при указание возвращаемого столбца, ключ всё таки начинает использоваться ...
> explain select ds from events where ds >= now();
> +----+-------------+--------+-------+---------------+------+---------+------+-------+--------------------------+
> | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
> +----+-------------+--------+-------+---------------+------+---------+------+-------+--------------------------+
> | 1 | SIMPLE | events | range | ds | ds | 3 | NULL | 49138 | Using where; Using index |
> +----+-------------+--------+-------+---------------+------+---------+------+-------+--------------------------+
>
>
> где логика? что я пропустил?
>
From: Akina - 26/04/2012 - 12:18:01
Subject:Использование индекса ....
-----------------
Почему при указании столбца (а также нескольких столбцов, но обязательно присутствующих в индексе) используется инждекс - это понятно. Потому что данные выбираются прямо из индекса, а не из таблицы, а это быстрее.
Почему оптимизатор решил не использовать индекс при выборе всех полей? Для ответа явно недостаточно данных, а предполагать можно много...
Кстати, а какова селективность запроса?
Если интересно - попробуйте:
1) зафорсить использование индекса;
2) создать индекс только по полю ds;
3) изменить условие отбора на равенство;
Сравните планы и время выполнения...
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
41152
|
|