SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 08.07.2011 18:18:54

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Анализ EXPLAIN

Всем привет.

CREATE TABLE `video_stats_2` (
  `video_id` int(11) DEFAULT NULL,
  `member_id` int(11) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `views` int(11) DEFAULT '0',
  `time` int(11) DEFAULT '0',
  `traffic` bigint(20) DEFAULT '0',
  KEY `member_id` (`member_id`),
  KEY `views` (`views`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


select count(*) from video_stats_2 where views=100;

выдаёт: 200

explain select count(*) from video_stats_2 where views=100;

выдаёт:
id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    video_stats_2    ref    views    views    5    const    510    Using where; Using index

Почему в explain-е 510 rows ?

Неактивен

 

#2 08.07.2011 18:27:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Анализ EXPLAIN

EXPLAIN только оценивает количество строк результата, а не выполняет сам запрос. Оценка выполняется на основании статистики индексов. Причина простая - explain показывает числа, которые влияют на выбор конкретного плана исполнения запроса (для простого запроса это ограничивается выбором индекса) и должны быть получены быстро, не выполняя запрос. Сделайте OPTIMIZE TABLE, оценка станет точнее.

Неактивен

 

#3 08.07.2011 19:01:59

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Анализ EXPLAIN

EXPLAIN только оценивает количество строк результата, а не выполняет сам запрос

И как это возможно не осуществив сам запрос ?

Оценка выполняется на основании статистики индексов.

То есть типо статистика ещё не обновилась ? 

Сделайте OPTIMIZE TABLE,

ENGINE=InnoDB

Неактивен

 

#4 08.07.2011 19:16:06

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Анализ EXPLAIN

evgeny написал:

И как это возможно не осуществив сам запрос ?

По статистике, которая хранится вместе с индексом (деревом). Пример - словарь, из которого нужно выбрать слова, начинающиеся на k и l. Вы смотрите на боковинку словаря и видите, что эти буквы занимают примерно 3 мм при толщине словаря 4 см. Зная, что в словаре 80000 слов, получаете оценку 80000/4.0*0.3=6000 слов. Принцип аналогичный, но статистика специально построена для дерева b-tree.

Самый простой пример - если запросите WHERE id>120000, но в таблице максимальный id 76321, MySQL сразу не выполняя запрос определит, что ответ - пустое множество (это отразится и в EXPLAIN).

То есть типо статистика ещё не обновилась ?

Даже когда статистика обновится, это все равно не будет точным ответом.

ENGINE=InnoDB

Сделайте ANALYZE TABLE.

Неактивен

 

Board footer

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