Size: a a a

2020 May 26

А

Александр in ru_mysql
мускуль должен взять индекс products.product_id и в обратном порядке начать извлекать из него записи, проверять если запись подходит по условиям, то оставляем, нет, идём дальше и т.к. там у нас почти всё подходит, то он извлечёт и проверит +/- 10 строк из products и остановится
источник

VS

Viktor Sh in ru_mysql
Но делает он вот так:
источник

🇻

🇻 🇱 🇦 🇩 in ru_mysql
Viktor Sh
Но делает он вот так:
меня напрягает что у вас скан 100к элементов просто на отображение страницы вебсайта
источник

VS

Viktor Sh in ru_mysql
Меня то же это напрягает и судя по молчанию ТП этой CMS их то же напрягает =)))
источник

VS

Viktor Sh in ru_mysql
Александр
мускуль не будет извлекать все 170к строк, если убрать в первом запросе SQL_CALC_FOUND_ROWS
Если убрать и Group By и Order by, то запрос так выполняется:
источник

ID

Igor Doroshenko in ru_mysql
Viktor Sh
Но делает он вот так:
Откуда такая картинка ?
источник

А

Александр in ru_mysql
Order by оставить
источник

А

Александр in ru_mysql
А вижу картинку...
источник

VS

Viktor Sh in ru_mysql
Igor Doroshenko
Откуда такая картинка ?
Explain из WorkBench
источник

ID

Igor Doroshenko in ru_mysql
Viktor Sh
Explain из WorkBench
Спасибо!
источник

А

Александр in ru_mysql
SELECT products.product_id,
   IF(shared_descr.product_id IS NOT NULL, shared_descr.product, descr1.product) as product,
   products.product_type,
   products.parent_product_id
FROM cscart_products as products -- (181 153)
LEFT JOIN
   cscart_product_descriptions as descr1 -- (174 225)
       ON descr1.product_id = products.product_id
           AND descr1.lang_code = 'ru'
LEFT JOIN
   cscart_ult_product_descriptions as shared_descr -- (175 810)
       ON shared_descr.product_id = products.product_id
           AND shared_descr.company_id = 1
           AND shared_descr.lang_code = 'ru'
WHERE 1
   AND (products.usergroup_ids = '' OR FIND_IN_SET(0, products.usergroup_ids) OR FIND_IN_SET(1, products.usergroup_ids))
   AND products.status IN ('A')
   AND products.parent_product_id = 0
   AND EXISTS (
       SELECT NULL
       FROM cscart_product_prices as prices -- (182 628)
       ON prices.product_id = products.product_id
           AND prices.lower_limit + 0 = 1
           AND prices.usergroup_id IN (0, 0, 1)
   )
   AND EXISTS (
       SELECT NULL
       FROM cscart_products_categories as products_categories -- (193 554)
       INNER JOIN
           cscart_categories -- (1218)
               ON cscart_categories.category_id = products_categories.category_id
                   AND (cscart_categories.usergroup_ids = '' OR FIND_IN_SET(0, cscart_categories.usergroup_ids) OR FIND_IN_SET(1,cscart_categories.usergroup_ids))
                   AND cscart_categories.status IN ('A', 'H')
       WHERE products_categories.product_id = products.product_id
           AND cscart_categories.company_id = 1
   )
ORDER BY products.product_id desc
LIMIT 0, 10;
источник

А

Александр in ru_mysql
Так попробуй
источник

VS

Viktor Sh in ru_mysql
Тут в 22ой строчке я исправлю ON на WHERE ?
источник

А

Александр in ru_mysql
Viktor Sh
Тут в 22ой строчке я исправлю ON на WHERE ?
Да вроде и так без исправления должно сработать
источник

VS

Viktor Sh in ru_mysql
Александр
Да вроде и так без исправления должно сработать
источник

А

Александр in ru_mysql
А ну да, пропустил
источник

VS

Viktor Sh in ru_mysql
Тогда вот так:
источник

VS

Viktor Sh in ru_mysql
Самое большое время на создание TMP
источник

А

Александр in ru_mysql
В этом запросе надо заставить мускуль точкой входа таблицу products и использовать примари кей
источник

А

Александр in ru_mysql
А план какой
источник