powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MariaDB - странная задержка при выполнении одного из запросов
11 сообщений из 11, страница 1 из 1
MariaDB - странная задержка при выполнении одного из запросов
    #39967403
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем дня.

Мой работодатель собирается переносить существующую систему (интернет магазин) на новую инфраструктуру (load balancer + несколько узлов с веб и mysql серверами). В целом все уже работает на новом месте, но при открытии определенных продуктов возникает странная задержка при выполнении одного запроса. Вот лог запроса:
[2020-06-09 12:14:36] Query:
SELECT IFNULL(pvtb.price, IFNULL(pv.price, p2b.products_price)), IFNULL(pvtb.special_price, pv.special_price), pv.status
FROM products p
JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '3'
LEFT JOIN products_variants pv ON p.products_id = pv.products_id AND pv.hash = '47991{1}607{2}95{3}58'
LEFT JOIN products_variants_to_brands pvtb ON pvtb.variant_id = pv.id AND pvtb.brand_id = '3'
WHERE p.products_id = '47991'

Executed for 53.521 seconds

При выполнении того же запроса через phpmyadmin все ок:
Showing rows 0 - 0 (1 total, Query took 0.0059 seconds.)

Т.е. проблема возникает только когда этот запрос вызывается из php кода (вместе с кучей других). Кеширование запросов включено, но проблемы не решает - при обновлении страницы зависание происходит на этом же запросе. Причем время зависания практически постоянно - 53-54 секунды.
План выполнения запроса ничего плохого не показывает:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 1SIMPLEpconstPRIMARYPRIMARY4const1Using index1SIMPLEp2bconstPRIMARY,products_idPRIMARY8const,const1 1SIMPLEpvconsthash,products_idhash767const1 1SIMPLEpvtbconstPRIMARY,variant_id,brand_idPRIMARY8const,const1

На моем локальном компе тот же продукт(запрос) открывается без задержки. Поэтому просто нет идей, что может быть причиной. Сисадмин той системы говорит, что никаких пиковых нагрузок при обновлении страницы не возникает, загрузка процессора 0.3% на всех процессах. Может, кто сталкивался с подобным или может подсказать, хоть в каком направлении копать?

Версии ПО на новом сервере:
Server version: 10.4.13-MariaDB-1:10.4.13
Database client version: libmysql - mysqlnd 5.0.12-dev
PHP version: 7.2.31
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967414
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что еще заметил по логу медленных запросов - задержка возникает даже не на определенном запросе, а на определенном месте php кода. Вот этот кусок кода:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    $sql = "SELECT pt.use_model, IFNULL(p2b.products_status, p.products_status) AS status, p.product_types_id, IFNULL(p2b.products_price, p.products_price) products_price, p.tax_class_id
FROM products p
 LEFT JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '" . intval($brand_id) . "'
 LEFT JOIN product_types pt ON p.product_types_id = pt.product_types_id
WHERE p.products_id = '" . intval($this->id) . "'";
    $product_info = db_get_single_row($sql, 'catalog_link');
    if (!$product_info || !isset($product_info['products_price'])/* || $product_info['status'] == 0*/) {
      return false;
    }
    $products_price_int = product_info::get_product_price($product_info['products_price'], intval($this->id), $product_info['tax_class_id']);
    if (USE_VARIANTS == 'true') {
      list($fProductPrice, $fProductSpecialPrice, $bStatus) = db_fetch_row(db_query("SELECT IFNULL(pvtb.price, IFNULL(pv.price, p2b.products_price)), IFNULL(pvtb.special_price, pv.special_price), pv.status
        FROM products p
        JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '" . intval($brand_id) . "'
        LEFT JOIN products_variants pv ON p.products_id = pv.products_id AND pv.hash = '" . $this->hash . "'
        LEFT JOIN products_variants_to_brands pvtb ON pvtb.variant_id = pv.id AND pvtb.brand_id = '" . intval($brand_id) . "'
        WHERE p.products_id = '" . intval($this->id) . "'
      ", 'catalog_link'));



Так вот в лог медленных запросов иногда попадает то первый, то второй запрос. Оба при выполнении напрямую выполняются моментально. Т.е. проблема даже не в самом запросе, а в том, что mysql в какой-то примерно один и тот же момент времени начинает "втыкать" около 53-54 секунд. Может, есть какое-то ограничение на кол-во запросов в одном коннекте и при его превышении mysql начинает задерживать их выполнение?
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967587
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackFedor,

и делай в разных коннектах из пула этих коннектов
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967599
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackFedor,

моментально быть не может, скорее всего когда из кэша, то быстро
у products_variants(id) есть индекс?
в общем то проверяйте индексы раз DDL не показываете
на все поля в связках ON как минимум
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967897
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

Да, индексы все есть. А как "моментально" я имею в виду время < 0.01сек. И если бы проблема была в запросе, то задержка была бы всегда именно на одном этом запросе. А тут ситуация такова, что одна и та же задержка "прыгает" то на один, то на другой запрос. Т.е. впечатление такое, что задержка происходит на определенном номере запроса в коннекте. А "прыжок" между запросами может быть связан с каким-нибудь дополнительным запросом при генерации страницы (например, переключение языка, обновление кеша и т.п.).

Вот думаю добавить с лог нумерацию запросов, чтобы проверить это предположение. Просто никогда с такой проблемой раньше не сталкивался.
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967930
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется запрос простой
Код: sql
1.
2.
3.
SELECT 1
FROM products p
WHERE p.products_id = '47991'

ну и лефтджойн к пару таблиц
только при условии
WHERE p.products_id = '47991'
LEFT JOIN не нужен, по крайней мере первый. Пробуйте простой Джойн
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967954
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

Запрос верный и LEFT JOIN там нужен. Но как я уже писал выше, мне кажется, что проблема не в каком-то конкретном запросе, а в их количестве за единицу времени или на коннект. Или еще в чем-то, что связано с настройками mysql сервера. Просто я с такой проблемой раньше не сталкивался, поэтому не представляю, какие именно переменные могут отвечать за такое поведение сервера.
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39967957
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackFedor
При выполнении того же запроса через phpmyadmin все ок:
Showing rows 0 - 0 (1 total, Query took 0.0059 seconds.)
При ручном/тестовом выполнении запросов добавляйте SQL_NO_CACHE после слова SELECT, чтобы запрос выполнялся реально, а не брал результат из квери кеша.
Кстати, query-cache-size чему равен?

И не замечали ли чего-то подобного с другими сервисами? Например, что файл статики иногда отдается слишком долго.
Пробовали с техподдержкой пообщаться?
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39968160
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

query_cache_size = 64M

запрос без кеша:
SELECT SQL_NO_CACHE IFNULL(pvtb.price, IFNULL(pv.price, p2b.products_price)), IFNULL(pvtb.special_price, pv.special_price), pv.status FROM products p JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '3' LEFT JOIN products_variants pv ON p.products_id = pv.products_id AND pv.hash = '47991{1}607{2}95{3}58' LEFT JOIN products_variants_to_brands pvtb ON pvtb.variant_id = pv.id AND pvtb.brand_id = '3' WHERE p.products_id = '47991'

Query took 0.0017 seconds

Сервер пока что еще только готовится к запуску, т.е. большой статистики использования пока нет, но кроме этой странной задержки вроде других проблем не замечено.
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39968241
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
движок таблиц какой?
сколько всего записей в Products?
Код: sql
1.
Select COUNT() from products?


каков время выполнения поиска несуществющей записи?
Код: sql
1.
WHERE p.products_id = '999999'


гонять надо не один запрос,а существенно разные вариации
Код: sql
1.
2.
3.
4.
SELECT SQL_NO_CACHE IFNULL(pvtb.price, IFNULL(pv.price, p2b.products_price)), IFNULL(pvtb.special_price, pv.special_price), pv.status FROM products p 
JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '3' 
LEFT JOIN products_variants pv ON p.products_id = pv.products_id AND pv.hash = '47991{1}607{2}95{3}58' 
LEFT JOIN products_variants_to_brands pvtb ON pvtb.variant_id = pv.id AND pvtb.brand_id = '3' /*WHERE p.products_id = '47991'*/

убрать посл условия совсем (выше) для фулскана, пробовать из разных "сторон" таблицы
Код: sql
1.
2.
 WHERE p.products_id = '1'
WHERE p.products_id = 'последняя'

пробовать скормить принудительно подзапросом ОДНУ запись наконец

Код: sql
1.
2.
3.
4.
5.
6.
SELECT SQL_NO_CACHE IFNULL(pvtb.price, IFNULL(pv.price, p2b.products_price)), 
IFNULL(pvtb.special_price, pv.special_price), pv.status
FROM (SELECT products_id FROM products WHERE products_id = '47991') AS p 
JOIN products_to_brands p2b ON p2b.products_id = p.products_id AND p2b.brands_id = '3' 
LEFT JOIN products_variants pv ON p.products_id = pv.products_id AND pv.hash = '47991{1}607{2}95{3}58' 
LEFT JOIN products_variants_to_brands pvtb ON pvtb.variant_id = pv.id AND pvtb.brand_id = '3' 

хотя тут по логике НЕ НУЖНА таблица Products Совсем
а смотреть индексы
(pv.products_id , pv.hash ) и
(pvtb.variant_id, pvtb.brand_id)
то что вы видите время Query took 0.0017 seconds - это полная неправда.
Пробуйте остановить MySQL запустить и выполнить ваш запрос первым, что-то прояснится.
Похоже иннодв_буфер_пул_сайз у вас заполняется иногда и все.
...
Рейтинг: 0 / 0
MariaDB - странная задержка при выполнении одного из запросов
    #39968608
BlackFedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, вопрос решился.

Сисадмин сообщил, что это была проблема буфера в load balancer сервера. Т.е. как я и предполагал, с самими запросами это не было связано.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MariaDB - странная задержка при выполнении одного из запросов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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