SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.11.2011 04:53:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

использование индекса сильно замедляет запрос

Доброго времени суток, Коллеги!

Поделитесь соображениями по сабжу плиз.

Есть таблица, содержащая измерения чего либо за единицу времени (в ней 10000 записей).

CREATE TABLE `e10000` (
  `t` int(11) NOT NULL,
  `d` bigint(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 

t - временная метка, d - результат измерения

Нужно получить выборку - временная метка, предыдущее значение измерения, текущее значение измерения

SELECT t, (SELECT `d` FROM `e10000` `in`  where `in`.t < `out`.`t` order by t desc limit 1  ) prev, d FROM e10000 `out` ORDER BY t;


Если на таблице нет индексов, то

Код:

mysql> explain SELECT t, (SELECT `d` FROM `e10000` `in`  where `in`.t < `out`.`t` order by t desc limit 1  ) prev, d FROM e10000 `out` ORDER BY t;
+----+--------------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
| id | select_type        | table | type | possible_keys | key  | key_len | ref  | rows  | Extra                       |
+----+--------------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
|  1 | PRIMARY            | out   | ALL  | NULL          | NULL | NULL    | NULL | 10000 | Using filesort              |
|  2 | DEPENDENT SUBQUERY | in    | ALL  | NULL          | NULL | NULL    | NULL | 10000 | Using where; Using filesort |
+----+--------------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
2 rows in set (0.00 sec)

и сам запрос отрабатывает 11 секунд.

Если же (и казалось бы логика это сильно подсказывает - добавить ключик на поле t), то explain становится

Код:

mysql> explain SELECT t, (SELECT `d` FROM `e10000` `in`  where `in`.t < `out`.`t` order by t desc limit 1  ) prev, d FROM e10000 `out` ORDER BY t;
+----+--------------------+-------+-------+---------------+------+---------+------+-------+----------------+
| id | select_type        | table | type  | possible_keys | key  | key_len | ref  | rows  | Extra          |
+----+--------------------+-------+-------+---------------+------+---------+------+-------+----------------+
|  1 | PRIMARY            | out   | ALL   | NULL          | NULL | NULL    | NULL | 10000 | Using filesort |
|  2 | DEPENDENT SUBQUERY | in    | index | t             | t    | 4       | NULL |     1 | Using where    |
+----+--------------------+-------+-------+---------------+------+---------+------+-------+----------------+

а сам запрос отрабатывает 59 секунд.

За счет чего наличие индекса настолько тормозит выполнение запроса? Ведь казалось бы наоборот - если без индекса, то MySQL переберет суммарно 10000 * 10000 строк, а с индексом-то пошустрее должно пройти.

Профилирование:

В первом запросе sending data как было очень быстрым, так таким и оставалось, а во втором сначала было гораздо медленнее, но постепенно уменьшалось.

В первом запросе Sorting data постепенно росло, во втором как было очень маленьким, так и оставалось до конца. Прикладываю результаты профилированиия.

Отредактированно deadka (20.11.2011 13:04:54)


Прикрепленные файлы:
Attachment Icon profiles.zip, Размер: 45,976 байт, Скачано: 1,145

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 20.11.2011 10:43:37

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

Re: использование индекса сильно замедляет запрос

Наверное это неэффективность LIMIT в подзапросе, который реально не ограничивает число выбираемых строк. Проверь в MariaDB - там обещали оптимизировать работу подзапросов.

P.S. EXPLAIN приведен два раза один и тот же (с индексом).

Неактивен

 

#3 20.11.2011 13:10:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: использование индекса сильно замедляет запрос

Да, с подзапросами беда какая-то ). Но даже если так (в смысле что limit реально не ограничивает количество строк, то есть нету оптимизации в этом смысле) - почему так медленно выполняется запрос с индексом? Профилирование показало, что самый длительный процесс - sending data, оно гораздо медленнее, чем sorting data в безиндексном варианте, почему так?

P.S. Поправил explain


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 20.11.2011 13:32:14

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

Re: использование индекса сильно замедляет запрос

Наверное sending data просто ждет чего-то и само не является причиной торможения. Почему с индексом медленнее, сказаь трудно.

Неактивен

 

#5 20.11.2011 13:38:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: использование индекса сильно замедляет запрос

Спасибо. Надо правда что пощупать на MariaDB. В то же время как-то абыдна! что ли. Не дружит MySQL c подзапросами, словом...


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 20.11.2011 20:32:17

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

Re: использование индекса сильно замедляет запрос

deadka, А разве с переменными не быстрее будет ?

Неактивен

 

#7 20.11.2011 20:34:53

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: использование индекса сильно замедляет запрос

Конечно быстрее smile. Да и на любом процедурном языке получилось бы быстрее. Но здесь хотелось сравнить именно в рамках реляционной модели.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

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