Задать вопрос
miv-men
@miv-men
Фронт и бэк

Как найти источник медленных запросы MySQL?

Здравствуйте.

Сайт на 1с-Битрикс.
Столкнулся с проблемой большой нагрузки на сервер вызванной sql запросами.
Логирование указало на проблемные запросы, но я не могу найти источник этих запросов.
Как можно найти от куда вызывается запрос?
Пара примеров:
SELECT DISTINCT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID,BE.CODE as CODE,BE.XML_ID as XML_ID,BE.NAME as NAME,BE.ACTIVE as ACTIVE,IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_FROM)>0, DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y %H:%i:%s'), DATE_FORMAT(BE.ACTIVE_FROM, '%d.%m.%Y')) as DATE_ACTIVE_FROM,IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_TO)>0, DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y %H:%i:%s'), DATE_FORMAT(BE.ACTIVE_TO, '%d.%m.%Y')) as DATE_ACTIVE_TO,BE.SORT as SORT,BE.PREVIEW_TEXT as PREVIEW_TEXT,BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE,BE.DETAIL_TEXT as DETAIL_TEXT,BE.DETAIL_TEXT_TYPE as DETAIL_TEXT_TYPE,DATE_FORMAT(BE.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE,BE.CREATED_BY as CREATED_BY,BE.TAGS as TAGS,DATE_FORMAT(BE.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X,BE.MODIFIED_BY as MODIFIED_BY,BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,B.DETAIL_PAGE_URL as DETAIL_PAGE_URL,BE.DETAIL_PICTURE as DETAIL_PICTURE,BE.PREVIEW_PICTURE as PREVIEW_PICTURE,L.DIR as LANG_DIR,BE.XML_ID as EXTERNAL_ID,B.IBLOCK_TYPE_ID as IBLOCK_TYPE_ID,B.CODE as IBLOCK_CODE,B.XML_ID as IBLOCK_EXTERNAL_ID,B.LID as LID , CAT_P35.ID as CATALOG_PRICE_ID_35,  CAT_P35.CATALOG_GROUP_ID as CATALOG_GROUP_ID_35,  CAT_P35.PRICE as CATALOG_PRICE_35,  CAT_P35.CURRENCY as CATALOG_CURRENCY_35,  CAT_P35.QUANTITY_FROM as CATALOG_QUANTITY_FROM_35,  CAT_P35.QUANTITY_TO as CATALOG_QUANTITY_TO_35,  'Оптовая цена' as CATALOG_GROUP_NAME_35,  'Y' as CATALOG_CAN_ACCESS_35,  'Y' as CATALOG_CAN_BUY_35,  CAT_P35.EXTRA_ID as CATALOG_EXTRA_ID_35, CAT_PR.QUANTITY as CATALOG_QUANTITY, CAT_PR.QUANTITY_RESERVED as CATALOG_QUANTITY_RESERVED,  IF (CAT_PR.QUANTITY_TRACE = 'D', 'N', CAT_PR.QUANTITY_TRACE) as CATALOG_QUANTITY_TRACE,  CAT_PR.QUANTITY_TRACE as CATALOG_QUANTITY_TRACE_ORIG,  IF (CAT_PR.CAN_BUY_ZERO = 'D', 'Y', CAT_PR.CAN_BUY_ZERO) as CATALOG_CAN_BUY_ZERO,  CAT_PR.CAN_BUY_ZERO as CATALOG_CAN_BUY_ZERO_ORIG,  IF (CAT_PR.NEGATIVE_AMOUNT_TRACE = 'D', 'Y', CAT_PR.NEGATIVE_AMOUNT_TRACE) as CATALOG_NEGATIVE_AMOUNT_TRACE,  CAT_PR.NEGATIVE_AMOUNT_TRACE as CATALOG_NEGATIVE_AMOUNT_ORIG,  IF (CAT_PR.SUBSCRIBE = 'D', 'Y', CAT_PR.SUBSCRIBE) as CATALOG_SUBSCRIBE,  CAT_PR.SUBSCRIBE as CATALOG_SUBSCRIBE_ORIG,  CAT_PR.AVAILABLE as CATALOG_AVAILABLE,  CAT_PR.WEIGHT as CATALOG_WEIGHT, CAT_PR.WIDTH as CATALOG_WIDTH, CAT_PR.LENGTH as CATALOG_LENGTH, CAT_PR.HEIGHT as CATALOG_HEIGHT,  CAT_PR.MEASURE as CATALOG_MEASURE,  CAT_VAT.RATE as CATALOG_VAT, CAT_PR.VAT_INCLUDED as CATALOG_VAT_INCLUDED,  CAT_PR.PRICE_TYPE as CATALOG_PRICE_TYPE, CAT_PR.RECUR_SCHEME_TYPE as CATALOG_RECUR_SCHEME_TYPE,  CAT_PR.RECUR_SCHEME_LENGTH as CATALOG_RECUR_SCHEME_LENGTH, CAT_PR.TRIAL_PRICE_ID as CATALOG_TRIAL_PRICE_ID,  CAT_PR.WITHOUT_ORDER as CATALOG_WITHOUT_ORDER, CAT_PR.SELECT_BEST_PRICE as CATALOG_SELECT_BEST_PRICE,  CAT_PR.PURCHASING_PRICE as CATALOG_PURCHASING_PRICE, CAT_PR.PURCHASING_CURRENCY as CATALOG_PURCHASING_CURRENCY,  CAT_PR.TYPE as CATALOG_TYPE, CAT_PR.BUNDLE as CATALOG_BUNDLE
					FROM 
			b_iblock B
			INNER JOIN b_lang L ON B.LID=L.LID
			INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
			INNER JOIN b_iblock_12_index FC on FC.ELEMENT_ID = BE.ID
 left join b_catalog_price CAT_P35 on (CAT_P35.PRODUCT_ID = BE.ID AND CAT_P35.CATALOG_GROUP_ID = 35)  left join b_catalog_product CAT_PR on (CAT_PR.ID = BE.ID)  left join b_catalog_iblock CAT_IB on ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)  left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) 

		
					WHERE 1=1 
			AND (
			
				(FC.SECTION_ID = 126 AND FC.FACET_ID = 1 AND FC.VALUE_NUM = 0 AND FC.VALUE in (0))
				AND (EXISTS (
						SELECT IBLOCK_ID FROM b_iblock_site WHERE IBLOCK_ID = B.ID
						AND (((SITE_ID='s1')))
					))
				AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL)))
				AND ((((BE.ACTIVE='Y'))))
				AND (
				
					(
					
						(
						
							((((CAT_P35.PRICE BETWEEN '80' AND '1344'))))
						)
					)
					OR (BE.ID IN  (
							SELECT   FPS0.PROPERTY_165
							FROM 
				b_iblock B
				INNER JOIN b_lang L ON B.LID=L.LID
				INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
				INNER JOIN b_iblock_element_prop_s28 FPS0 ON FPS0.IBLOCK_ELEMENT_ID = BE.ID
 left join b_catalog_price CAT_P35 on (CAT_P35.PRODUCT_ID = BE.ID AND CAT_P35.CATALOG_GROUP_ID = 35)  left join b_catalog_product CAT_PR on (CAT_PR.ID = BE.ID)  left join b_catalog_iblock CAT_IB on ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)  left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) 

		
							WHERE 1=1
								
				AND (
				
					((((CAT_P35.PRICE BETWEEN '80' AND '1344'))))
					AND ((((BE.IBLOCK_ID = '28'))))
					AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL)))
					AND ((((BE.ACTIVE='Y'))))
				)
				AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
				AND (((FPS0.PROPERTY_165 IS NOT NULL)))
							))
				)
				AND ((((BE.IBLOCK_ID = '12'))))
			)
			AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
					
					 ORDER BY BE.SORT asc ,BE.ID desc 
				 LIMIT 0, 40;


SELECT COUNT(DISTINCT BE.ID) as C
						FROM 
			b_iblock B
			INNER JOIN b_lang L ON B.LID=L.LID
			INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
			INNER JOIN b_iblock_12_index FC on FC.ELEMENT_ID = BE.ID
 left join b_catalog_price CAT_P24 on (CAT_P24.PRODUCT_ID = BE.ID AND CAT_P24.CATALOG_GROUP_ID = 24)  left join b_catalog_product CAT_PR on (CAT_PR.ID = BE.ID)  left join b_catalog_iblock CAT_IB on ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)  left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) 

		
						WHERE 1=1 
			AND (
			
				(FC.SECTION_ID = 123 AND FC.FACET_ID = 270 AND FC.VALUE_NUM = 0 AND FC.VALUE in (111))
				AND (EXISTS (
						SELECT IBLOCK_ID FROM b_iblock_site WHERE IBLOCK_ID = B.ID
						AND (((SITE_ID='s1')))
					))
				AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL)))
				AND ((((BE.ACTIVE='Y'))))
				AND (
				
					(
					
						(
						
							((((CAT_P24.PRICE BETWEEN '0' AND '5000'))))
						)
					)
					OR (BE.ID IN  (
							SELECT   FPS0.PROPERTY_165
							FROM 
				b_iblock B
				INNER JOIN b_lang L ON B.LID=L.LID
				INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
				INNER JOIN b_iblock_element_prop_s28 FPS0 ON FPS0.IBLOCK_ELEMENT_ID = BE.ID
 left join b_catalog_price CAT_P24 on (CAT_P24.PRODUCT_ID = BE.ID AND CAT_P24.CATALOG_GROUP_ID = 24)  left join b_catalog_product CAT_PR on (CAT_PR.ID = BE.ID)  left join b_catalog_iblock CAT_IB on ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID)  left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) 

		
							WHERE 1=1
								
				AND (
				
					((((CAT_P24.PRICE BETWEEN '0' AND '5000'))))
					AND ((((BE.IBLOCK_ID = '28'))))
					AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL)))
					AND ((((BE.ACTIVE='Y'))))
				)
				AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
				AND (((FPS0.PROPERTY_165 IS NOT NULL)))
							))
				)
				AND ((((BE.IBLOCK_ID = '12'))))
			)
			AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)))
			AND ((
				B.ID IN (
			SELECT IBLOCK_ID
			FROM b_iblock_group IBG
			WHERE IBG.GROUP_ID IN (2)
			AND IBG.PERMISSION >= 'R'
		
				AND (IBG.PERMISSION='X' OR B.ACTIVE='Y')
			)
				OR (B.RIGHTS_MODE = 'E' AND EXISTS (
				SELECT ER.ELEMENT_ID
				FROM b_iblock_element_right ER
				INNER JOIN b_iblock_right IBR ON IBR.ID = ER.RIGHT_ID
				INNER JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = 0
				WHERE ER.ELEMENT_ID = BE.ID
				AND IBR.OP_EREAD = 'Y'
				
			))
			));


Товаров и клиентов много, по этому таблицы тяжелые из тех что в примере 50 - 100 мб.
Таблицы проиндексированы, но индексов много, так как поиск данных осуществляется по нескольким полям.
Тип полей- InnoDB.
  • Вопрос задан
  • 3042 просмотра
Подписаться 5 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 10
@karminski
Senior React.JS Developer
Ну это же Битрикс! Там все запросы такие! Их источник - само ядро Битрикс. Так что ничего серьезного вы в них не измените.
Ответ написан
Комментировать
samodum
@samodum
Какой вопрос - такой и ответ
Сайт на 1с-Битрикс.

Вот и проблема.
Дальше читать не имеет смысла.

Текст запроса значения тоже не имеет - нужны данные о самих таблицах: размер, индексы, типы полей, по которым идут джойны.
Это целая аналитическая работа.
Смотри план выполнения
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Непонятно, зачем тебе источник.

Запрос у тебя есть - его и надо оптимизировать.
Ответ написан
Комментировать
@anton99zel Куратор тега 1С-Битрикс
29а класс средней школы №7
Уменьшите количество элементов на страницу, включите кэширование, удалите неиспользуемые свойства, выводите только нужные, проведите оптимизацию на странице производительности, пересоздайте фасетный поиск. Проверьте компоненты на сторонний код. Смотрите сервер - сколько памяти и как она расходуется, используйте php7
Короче тут можно трехтомник писать этих советов)
Ответ написан
BusteR27
@BusteR27
Lead bitrix dev
Найти место, где генерятся эти запросы не сложно - достаточно запустить Монитор производительности с записью sql-запросов.

Так найдется место где неоптимизированный запрос. На вкладке с запросами можно будет запустить анализ индексов.
Ответ написан
@0x131315
Многие запросы на битрикс немного ускоряются, если уточнить запрос, например вместо 'IBLOCK_ID'=>10 указывать '=IBLOCK_ID'=>10
Ответ написан
Комментировать
@shtirmuz
Попробуйте для начала более быстрый хостинг. На nvme к примеру
Ответ написан
@filimonov-da
Источник компонент catalog.section
Нормальный запрос, если медленный смотри движок бд и индексы.
Так же в битре есть мониторинг производительности он подскажет чего не хватает.
Ответ написан
Комментировать
askunash
@askunash
Тренер Битрикс
100:1 что суперкодер, считающий битрикс отстоем, доработал стандартный компонент и поломал кэширование.
Видел я такие проекты. Учиться надо - битрикс большая коммерческая система со своими правилами. И выдерживает магазины миллионники - Эльдорадо, мвидео, wildberris, ulmart и т.д.
Ответ написан
veshetu
@veshetu
web-dev
можно подправить код вызова select.
добавить коммент в sql запрос с трейсом вызова:)
изврат!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы