Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос замедлился в 100 раз / 23 сообщений из 23, страница 1 из 1
17.06.2019, 08:52
    #39827075
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
есть такой код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
for ($i=0; $i<=1000000;$i++) {
    
    $start=microtime(true);
		$row = Db::getInstance()->getRow('
			SELECT `id_image`, `url`,`id_product`
			FROM `'._DB_PREFIX_.'image`
			WHERE `url` IN
			(SELECT `url`
			 FROM `'._DB_PREFIX_.'image`
			 WHERE `id_image` = '.intval($i).'
			 AND `url` > "")');
             file_put_contents('1', (microtime(true)-$start)."\n", FILE_APPEND);
}

 CREATE TABLE `ps_image` (
  `id_image` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_product` int(10) unsigned NOT NULL,
  `position` smallint(2) unsigned NOT NULL DEFAULT '0',
  `cover` tinyint(1) unsigned DEFAULT NULL,
  `url` text,
  `img_upd` datetime NOT NULL,
  PRIMARY KEY (`id_image`),
  UNIQUE KEY `id_product_cover` (`id_product`,`cover`),
  UNIQUE KEY `idx_product_image` (`id_image`,`id_product`,`cover`),
  KEY `image_product` (`id_product`)
) ENGINE=InnoDB AUTO_INCREMENT=174167 DEFAULT CHARSET=utf8 |


почему время выполнения запроса растет линейно?
в начале время 0.00062894821166992
на строке 80 тыс было время 0.096501111984253
работал минут 10, дальше не стал ждать
запрос писал не я, обнаружил при отладке
хочу понять почему такое поведение?
...
Рейтинг: 0 / 0
17.06.2019, 09:00
    #39827078
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
если заменить WHERE `id_image` = '.intval($i).' на WHERE `id_image` = 1 в цикле, то скорость не уменьшается
...
Рейтинг: 0 / 0
17.06.2019, 09:02
    #39827079
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
вместо 1 любое постоянное число-скорость не уменьшается
...
Рейтинг: 0 / 0
17.06.2019, 09:26
    #39827088
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyilodaвместо 1 любое постоянное число-скорость не уменьшается

А почему вдруг скорость уменьшаться должна?
...
Рейтинг: 0 / 0
17.06.2019, 09:30
    #39827091
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
потому что при такой записи WHERE `id_image` = '.intval($i).' скорость уменьшается
...
Рейтинг: 0 / 0
17.06.2019, 10:15
    #39827105
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyiloda,

Что мы видим в коде:
1. В заголовке цикла переменной $i присваивается целое число.
2. intval($i) берет целую часть от целочисленного $i. Нафига оно, если значение не изменяется?
3. Далее при сборке строки запроса выполняется неявное преобразование целого в строку и только потом происходит конкатенация.
При таком раскладе было бы гораздо более правильным на втором шаге целочисленное привести к строковому типу.
...
Рейтинг: 0 / 0
17.06.2019, 10:18
    #39827109
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyiloda,

планы выполнения запросов посмотреть, конечно же, вы не догадались?
В целом, есть подозрение, что оптимизатор неверно рассчитывает кардинальность подзапроса при параметрическом задании условия и гораздо точнее это делает - при константном варианте. Это приводит в дальнейшем к корявой трансформации запроса и неправильному (неоптимальному) способу доступа к данным и соединения наборов данных. Отсюда и разность в скорости исполнения
...
Рейтинг: 0 / 0
17.06.2019, 10:18
    #39827111
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
по самому запросу есть что сказать? почему скорость уменьшается
...
Рейтинг: 0 / 0
17.06.2019, 11:05
    #39827133
Хитроглазый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyilodaпо самому запросу есть что сказать? почему скорость уменьшается
запрос - го*но,
да ещё и в цикле
...
Рейтинг: 0 / 0
17.06.2019, 12:12
    #39827164
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyilodaпо самому запросу есть что сказать?
1. Запрос плохой.
2. Запрос кешируется.
...
Рейтинг: 0 / 0
17.06.2019, 12:33
    #39827177
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
то что запрос плохой я не спорю, но изза чего так сильно падает скорость?
если после завершения цикла запустить его заново, то вначале опять скорость высокая, и затем падает со временем
...
Рейтинг: 0 / 0
17.06.2019, 12:40
    #39827180
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
Скорость падает из-за кривого запроса, который использует ресурсы сервера неэффективно.
Нужно изучать статистику и план выполнения, чтобы выяснить, где именно получается узкое место.
...
Рейтинг: 0 / 0
17.06.2019, 12:47
    #39827184
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
explain то будет не?
...
Рейтинг: 0 / 0
17.06.2019, 13:06
    #39827192
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
Код: sql
1.
2.
3.
4.
5.
6.
7.
explain SELECT `id_image`, `url`,`id_product`
			FROM `ps_image`
			WHERE `url` IN
			(SELECT `url`
			 FROM `ps_image`
			 WHERE `id_image` = 2
			 AND `url` > "")
...
Рейтинг: 0 / 0
17.06.2019, 13:29
    #39827203
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
подзапрос константный, он выполняется один раз а затем для каждой строки проверяется совпадение url

дичайший запрос
нельзя написать так?
Код: sql
1.
2.
3.
4.
SELECT `id_image`, `url`,`id_product`
FROM `ps_image`
WHERE `id_image` = ?
AND `url` > ""
...
Рейтинг: 0 / 0
17.06.2019, 13:31
    #39827205
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
или в оригинальном запросе скрыт какой-то тайный смысл?
...
Рейтинг: 0 / 0
17.06.2019, 19:52
    #39827449
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
Дегтярев Евгенийили в оригинальном запросе скрыт какой-то тайный смысл?Так понимаю, что запросом нужно найти все картинки, которые по полю `url` совпадают с заданной по ID картинкой, при условии, что `url` не пустая строка. Нечто вроде "по заданной картинке найти остальные картинки для статьи (альбома, веб-страницы и т.п.)"

Однако, исходной задачи - для чего оно надо и что должно получиться на выходе мы не знаем. Возможно, зная задачу можно было бы оптимизировать и запрос и, возможно, таблицу.

Из очевидного. Поле `url` не проиндексировано, но принимает участие в WHERE, а это заставляет движок просматривать всю таблицу.

К тому же, поле имеет тип TEXT, который, если правильно понимаю внутреннюю кухню, работает медленнее, чем CHAR, например.
...
Рейтинг: 0 / 0
17.06.2019, 21:34
    #39827459
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
Дегтярев Евгенийподзапрос константный, он выполняется один разЗависит от версии MySQL. Версии до 5.6 (это не точно) выполняли подзапрос на каждую проверку.
...
Рейтинг: 0 / 0
18.06.2019, 05:28
    #39827499
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
miksoft,
не спорю что зависит от версии, исходил из показанного плана
...
Рейтинг: 0 / 0
18.06.2019, 06:13
    #39827502
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
vkleТак понимаю, что запросом нужно найти все картинки, которые по полю `url` совпадают с заданной по ID картинкой, при условии, что `url` не пустая строка. Нечто вроде "по заданной картинке найти остальные картинки для статьи (альбома, веб-страницы и т.п.)"

тогда задача решена весьма криво

vkleИз очевидного. Поле `url` не проиндексировано, но принимает участие в WHERE, а это заставляет движок просматривать всю таблицу.

К тому же, поле имеет тип TEXT, который, если правильно понимаю внутреннюю кухню, работает медленнее, чем CHAR, например.
как вариант, добавить поле фикс длины, содержащее хеш url, + индекс по нему
...
Рейтинг: 0 / 0
18.06.2019, 13:25
    #39827696
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
Дегтярев Евгенийтогда задача решена весьма кривоУгу. Что за задача - это лишь мое предположение, а ТС пока не озвучил, что за задача там на самом деле решается.
...
Рейтинг: 0 / 0
18.06.2019, 13:33
    #39827705
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
про задачу ничего не скажу
мне дали код, который при длительной работе сильно замедлялся
после отладки нашел этот запрос и очень удивился, я привык что запрос выполняется или медленно или быстро
а тут запрос вначале выполняется быстро а затем скорость начинает линейно падать
...
Рейтинг: 0 / 0
18.06.2019, 16:31
    #39827837
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос замедлился в 100 раз
tadeyilodaя привык что запрос выполняется или медленно или быстро
а тут запрос вначале выполняется быстро а затем скорость начинает линейно падатьВ общем случае на время выполнения запроса влияет туева хуча причин, притом, некоторые из них весьма неочевидны.
Например, из неочевидного:
Висит ли таблица в каждый конкретный момент целиком в памяти или сервер вынужден перечитывать ее с диска целиком или частично.
Берутся ли готовые возвращаемые данные из кеша запросов или запрос должен отработать полностью на таблице.
Наличие каких-то других обращений к серверу в это же время.
Если хотите разобраться с природой тормозов, тогда придется как-то контролировать и эти и подобные вещи.
Про очевидные проблемы выше уже написали.

Ещё момент. В приведенном коде вычисляется время работы какого-то метода какого-то класса, а не время выполнения запроса непосредственно. Что скрывается за Db::getInstance()->getRow() и как оно влияет на результат измерения мы не знаем. Может и никак не влияет, а может при каждом вызове плодит где-то внутри новый экземпляр класса, под который надо выделить память и т.д...

tadeyilodaпро задачу ничего не скажу
мне дали код, который при длительной работе сильно замедлялсяДали код с целью просто посмотреть на него, дабы впредь так не делать? В общем, да, хороший пример. Или, всё же, призвали приложить усилия к устранению проблем с тормозами? ;-) В последнем случае без понимания решаемой кодом задачи сложно ее решать.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос замедлился в 100 раз / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]