powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос замедлился в 100 раз
23 сообщений из 23, страница 1 из 1
запрос замедлился в 100 раз
    #39827075
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой код
Код: 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
запрос замедлился в 100 раз
    #39827078
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если заменить WHERE `id_image` = '.intval($i).' на WHERE `id_image` = 1 в цикле, то скорость не уменьшается
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827079
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо 1 любое постоянное число-скорость не уменьшается
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827088
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadeyilodaвместо 1 любое постоянное число-скорость не уменьшается

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

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

планы выполнения запросов посмотреть, конечно же, вы не догадались?
В целом, есть подозрение, что оптимизатор неверно рассчитывает кардинальность подзапроса при параметрическом задании условия и гораздо точнее это делает - при константном варианте. Это приводит в дальнейшем к корявой трансформации запроса и неправильному (неоптимальному) способу доступа к данным и соединения наборов данных. Отсюда и разность в скорости исполнения
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827111
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по самому запросу есть что сказать? почему скорость уменьшается
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827133
Хитроглазый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadeyilodaпо самому запросу есть что сказать? почему скорость уменьшается
запрос - го*но,
да ещё и в цикле
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827164
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadeyilodaпо самому запросу есть что сказать?
1. Запрос плохой.
2. Запрос кешируется.
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827177
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то что запрос плохой я не спорю, но изза чего так сильно падает скорость?
если после завершения цикла запустить его заново, то вначале опять скорость высокая, и затем падает со временем
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827180
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорость падает из-за кривого запроса, который использует ресурсы сервера неэффективно.
Нужно изучать статистику и план выполнения, чтобы выяснить, где именно получается узкое место.
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827184
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explain то будет не?
...
Рейтинг: 0 / 0
запрос замедлился в 100 раз
    #39827192
tadeyiloda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
запрос замедлился в 100 раз
    #39827203
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подзапрос константный, он выполняется один раз а затем для каждой строки проверяется совпадение url

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

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

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

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

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

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

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

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

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


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