SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.09.2009 17:26:58

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Выборка `field` IN(подзапрос). Хотелось бы чуточку быстрее

Табличка:

CREATE TABLE IF NOT EXISTS `qip_hist` (
  `id` int(11) NOT NULL auto_increment,
  `datetime` datetime NOT NULL,
  `date` date NOT NULL,
  `nick` varchar(200) NOT NULL,
  `text` mediumtext NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `datetime` (`datetime`),
  KEY `date` (`date`),
  KEY `nick` (`nick`),
  KEY `dt2` (`date`,`datetime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


Всего чуть более 25000 записей.

Запросик:
SELECT *
FROM `qip_hist`
WHERE `datetime`
IN (
  SELECT MIN( `datetime` )
  FROM `qip_hist`
  GROUP BY `date`
)
LIMIT 1


Отрабатывает за доли секунды (возвращается запись с PRIMARY=1). А с LIMIT 2 уже 25 секунд, хотя между этими 2мя искомыми записями разница по примари ключу = 70.

EXPLAIN SELECT *
FROM `qip_hist`
WHERE `datetime`
IN (
  SELECT MIN( `datetime` )
  FROM `qip_hist`
  GROUP BY `date`
)

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    PRIMARY    qip_hist    ALL    NULL    NULL    NULL    NULL    25304    Using where
2    DEPENDENT SUBQUERY    qip_hist    index    NULL    dt2    11    NULL    25304    Using index

Отдельно DEPENDENT SUBQUERY так же отрабатывает по индексу без проблем, возвращая 230 записей. И если вот эти записи отдельно извлечь и подставить в основной запрос, то всё работает на ура. Откуда такие странности?

Неактивен

 

#2 06.09.2009 16:08:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка `field` IN(подзапрос). Хотелось бы чуточку быстрее

Кажется, запросы у Вас таки не связанные, попробуйте переписать это все через объединение
SELECT a.*
FROM qip_hist a, (SELECT MIN( `DATETIME` )  FROM `qip_hist`  GROUP BY `DATE`) b
WHERE a.`DATETIME` = b.`DATETIME`
LIMIT 2

В случае подзапроса Вам нужно пробежать дополнительным сканом не 70 строк, а 70*25304 строк.

А вообще, чрезвычайно странная организация данных smile

Неактивен

 

#3 06.09.2009 17:38:41

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

Re: Выборка `field` IN(подзапрос). Хотелось бы чуточку быстрее

Альтернативно можно переписать через временную таблицу или переменную.


SET @md := SELECT MIN( `DATETIME` )
  FROM `qip_hist`
  GROUP BY `DATE` ;

SELECT *
FROM `qip_hist`
WHERE `DATETIME`=@md;

Неактивен

 

#4 06.09.2009 21:24:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Выборка `field` IN(подзапрос). Хотелось бы чуточку быстрее

Если подзапрос в части IN, то MySQL всегда считает его DEPENDENT. Единственный способ бороться с этим - переписать запрос.

Неактивен

 

Board footer

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