MySQL » Сложности с MySql Explain

*
0
*
✩
Добрый день!
Выполняю запрос
EXPLAIN SELECT ref_id, MAX(curl_request_id) AS max_curl_request_id, MIN(curl_request_id) AS min_curl_request_id
FROM curl_requests
WHERE  context='completed' AND ref_id IN (2207956)
GROUP by ref_id

Имею:
ref: const,const
Extra: Using where; Using index; Using temporary; Using filesort


Стоит отметить, что ref_id и context образуют индекс

Когда я вместо ref_id IN (2207956) пишу AND ref_id IN (2207956,2207968), то есть, на первый взгляд, утяжелею запрос, так как должно выбраться больше строчек, то результаты улучшаются, так как проподают Using temporary; Using filesort:

ref: null
Extra: Using where; Using index;


CREATE TABLE  `curl_requests` (
  `curl_request_id` bigint(20) unsigned NOT NULL auto_increment,
  `prev_curl_request_id` bigint(20) unsigned NOT NULL default '0',
  `curl_request_key` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  `params` text NOT NULL,
  `timeout` tinyint(2) unsigned NOT NULL default '0',
  `ssl_cert_path` varchar(255) NOT NULL default '',
  `errno` smallint(3) NOT NULL default '0',
  `http_code` mediumint(3) unsigned NOT NULL default '0',
  `response_body` text NOT NULL,
  `ref_id` int(11) NOT NULL default '0',
  `context` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`curl_request_id`),
  KEY `prev_curl_request_id` (`prev_curl_request_id`),
  KEY `ref_id_context` (`ref_id`,`context`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


Почему так происходит?
Еще хочу узнать, поподробнее, про ref. что значит ref: const,const, а что значит ref: null
mysql
2 года 2 месяца назад
9% принято

#ссылка
Без Create Table ответа на вопрос не получишь :)
Stalin 2 года 2 месяца назад #
в самой таблице реально сколько строк?
gerasim 2 года 2 месяца назад #
хотя да, пардон, видно что много...
gerasim 2 года 2 месяца назад #
1208706 строк
Arty275 2 года 2 месяца назад #
Попробуйте добавить ORDER BY ref_id в 1-й вариант и посмотреть что даст EXPLAIN.
a1ex07 2 года 2 месяца назад #
а индекс составной у вас {context+ref_id} ? (именно в таком порядке?)
alien 2 года 2 месяца назад #
комментировать



*
0
*
Не так страшен temporary как его малюют.
Посмотрите в explain внимательно сколько строк таблицы предполагает обработать запрос. В некоторых случаях temp table очень быстр. Быстрее, чем беготня по ключам. mysql выбирает execution plan исходя из минимального прогнозируемого времени исполнения а не минимальной ресурсоемкости.
temp table на 100 записей одзнозначно быстрее, чем прыжки по ключам в 1000000 записей. Так что смотрите в первую очередь в explain на прогноз числа обрабатываемых записей.
#ссылка
2 года 2 месяца назад
Комментировать

Ваш Ответ:


Ваш OpenID


Получить OpenID

Что такое OpenID?
или

Логин

Email

Пароль


Будет создана учетная запись и на email выслано письмо подтверждения.

новые ответы

Первый раз на сайте?

askdev.ru — это социальный сайт вопросов и ответов для IT-специалистов.

Более 9000 профессиональных и начинающих айтишников уже с нами. Присоединяйтесь и Вы!

Задайте вопрос и получите ответ от всезнающего сообщества askdev.
о сайте » регистрация »

Показан

1646 раз

Задан

2 года 2 месяца назад

Теги
mysql x 893
X

Пожалуйста, войдите:


Имя:
Пароль:
регистрация
Или используйте OpenID