Что замедляет этот поисковый запрос MySQL? - PullRequest
0 голосов
/ 25 октября 2019

Мы используем платформу электронной коммерции OpenCart, работающую на PHP 7.2 с MySQL 5.7.27, с около 5000 продуктов.

Мы используем расширение для поиска товаров в панели администратора, и оно занимает около 70-80среднее количество секунд для выполнения поискового запроса.

Необработанный запрос:

SELECT
   SQL_CALC_FOUND_ROWS pd.*,
   p.*,
   (
      SELECT
         price 
      FROM
         product_special 
      WHERE
         product_id = p.product_id 
         AND 
         (
            date_start = '0000-00-00' 
            OR date_start < NOW() 
            AND 
            (
               date_end = '0000-00-00' 
               OR date_end > NOW()
            )
         )
      ORDER BY
         priority,
         price LIMIT 1
   )
   AS special_price,
   IF(p.image IS NOT NULL 
   AND p.image <> '' 
   AND p.image <> 'no_image.png', 'Igen', 'Nem') AS image_text,
   IF(p.status, 'Engedélyezett', 'Letiltott') AS status_text,
   GROUP_CONCAT(DISTINCT CONCAT_WS(' > ', fgd.name, fd.name) 
ORDER BY
   CONCAT_WS(' > ', fgd.name, fd.name) ASC SEPARATOR '
 ') AS filter_text, GROUP_CONCAT(DISTINCT fd.filter_id ORDER BY CONCAT_WS(' > ', fgd.name, fd.name) ASC SEPARATOR '_') AS filter, GROUP_CONCAT(DISTINCT cat.name ORDER BY cat.name ASC SEPARATOR ' ') AS category_text, GROUP_CONCAT(DISTINCT cat.category_id ORDER BY cat.name ASC SEPARATOR '_') AS category, GROUP_CONCAT(DISTINCT IF(p2s.store_id = 0, 'Butopêa HU', s.name) SEPARATOR ' ') AS store_text, GROUP_CONCAT(DISTINCT p2s.store_id SEPARATOR '_') AS store FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id AND pd.language_id = '2') LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN (SELECT cp.category_id AS category_id, GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR ' > ') AS name FROM category_path cp LEFT JOIN category c ON (cp.path_id = c.category_id) LEFT JOIN category_description cd1 ON (c.category_id = cd1.category_id) LEFT JOIN category_description cd2 ON (cp.category_id = cd2.category_id) WHERE cd1.language_id = '2' AND cd2.language_id = '2' GROUP BY cp.category_id ORDER BY name) AS cat ON (p2c.category_id = cat.category_id) LEFT JOIN product_to_category p2c2 ON (p.product_id = p2c2.product_id) LEFT JOIN product_filter p2f ON (p.product_id = p2f.product_id) LEFT JOIN filter f ON (f.filter_id = p2f.filter_id) LEFT JOIN filter_description fd ON (fd.filter_id = p2f.filter_id AND fd.language_id = '2') LEFT JOIN filter_group_description fgd ON (f.filter_group_id = fgd.filter_group_id AND fgd.language_id = '2') 
   LEFT JOIN
      product_filter p2f2 
      ON (p.product_id = p2f2.product_id) 
   LEFT JOIN
      product_to_store p2s 
      ON (p.product_id = p2s.product_id) 
   LEFT JOIN
      store s 
      ON (s.store_id = p2s.store_id) 
   LEFT JOIN
      product_to_store p2s2 
      ON (p.product_id = p2s2.product_id) 
GROUP BY
   p.product_id 
ORDER BY
   pd.name ASC LIMIT 0,
   190

Я пытался использовать функциональность MySQL EXPLAIN, чтобы увидеть, что происходит, но ничто не сразу привлекает мое внимание: enter image description here

Моя тестовая среда работает на Intel NVME, 2666 МГц DDR4 RAM и i7 8th gen. Процессор, и все же он все еще очень медленный.

Я ценю любые подсказки относительно того, что замедляет этот запрос.

...