Вот второй запрос из вашего журнала, просмотр других. Чтобы помочь в этом, я немного реструктурировал, чтобы избавиться от подзапроса и превратился во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Кроме того, чтобы помочь другим, не знающим ваши таблицы, всегда определяйте ссылки на поля как table.column или alias.column, например, чтобы знать, откуда берутся ваши level_depth, nleft, nright. Это может помочь с индексами.
Для индексов у меня было бы следующее для каждой таблицы.
ps_category, index ON( active, id_category, id_lang, nleft, nright, level_depth )
ps_category_lang, index ON( id_category, id_shop, id_lang )
ps_category_shop, index ON( id_category, id_shop )
ps_category_group, index ON( id_category, id_group )
ps_lang, index ON( id_lang, active )
немного переписанный запрос
SELECT
c.id_parent,
c.id_category,
cl.name,
cl.description,
cl.link_rewrite
FROM
ps_category c
INNER JOIN ps_category_lang cl
ON c.id_category = cl.id_category
AND cl.id_shop = 1
AND cl.id_lang = 2
INNER JOIN ps_category_shop cs
ON c.id_category = cs.id_category
AND cs.id_shop = 1
INNER JOIN ps_category_group psg
ON c.id_category = psg.id_category
AND psg.id_group = 1
WHERE
( c.active = 1
OR c.id_category = 2)
AND c.id_category != 1
AND level_depth <= 7
AND nleft >= 350 AND nright <= 351
ORDER BY
level_depth ASC,
cs.position ASC;
Третий запрос. Обратите внимание, что в этом случае некоторые из ключевых элементов, которые являются специфическими, перемещены вверх, поэтому они также находятся в ключевом индексе, ТОГДА остальные в предложении where (в основном корректировки читабельности, но помогают увидеть «конкретные» элементы для преимущества индекса)
SELECT
c.id_category,
cl.name,
cl.link_rewrite
FROM
ps_category c
LEFT JOIN ps_category_lang cl
ON c.id_category = cl.id_category
AND cl.id_shop = 1
INNER JOIN ps_category_shop category_shop
ON c.id_category = category_shop.id_category
AND category_shop.id_shop = 1
WHERE
c.active = 1
AND cl.id_lang = 2
AND c.nleft between 2 and 350
AND c.nright between 351 and 625
AND c.level_depth > 1
ORDER BY
c.level_depth ASC;
В следующем запросе вам нужно подтвердить, что вы действительно хотели... У вас есть левое соединение с языковой таблицей, но затем добавьте «AND l.active = 1» в предложении where, что на самом деле превратит его в INNER ПРИСОЕДИНИТЬСЯ. Если вы действительно хотите, чтобы это было LEFT-JOIN, переместите l.active в часть соединения, как я настроил здесь.
SELECT
l.id_lang,
c.link_rewrite
FROM
ps_category_lang AS c
LEFT JOIN ps_lang AS l
ON c.id_lang = l.id_lang
AND l.active = 1
WHERE
c.id_category = 324
Надеемся, что эти индексы и образцы разъяснений/удобочитаемости запросов могут помочь улучшить ваши журналы. Если все еще проблемы с другими, напишите по мере необходимости.
ВЕРСИЯ ДЛЯ ПЕРВОГО ЗАПРОСА В ОТЧЕТЕ О ЗАПРЕЩЕНИИ РЕГИСТРАЦИИ
В первом запросе кажется, что вы ищете вещи из определенного магазина продуктов. Тем не менее, вы начинаете запрос с категории продуктов и слева присоединяетесь к продуктам, а затем к продуктовым магазинам. Поскольку эти продукты в конечном итоге будут связаны с определенной категорией через where, в любом случае создается ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Я бы немного реструктурировал, как показано ниже
Я бы включил один индекс для ps_product_shop ( id_shop, active, visibility, id_product, id_category_default )
SELECT
p.*,
ps.*,
stock.out_of_stock,
IFNULL(stock.quantity, 0) as quantity,
MAX(pas.id_product_attribute) id_product_attribute,
pas.minimal_quantity AS product_attribute_minimal_quantity,
pl.description,
pl.description_short,
pl.available_now,
pl.available_later,
pl.link_rewrite,
pl.meta_description,
pl.meta_keywords,
pl.meta_title,
pl.name,
MAX(image_shop.id_image) id_image,
il.legend,
m.name AS manufacturer_name,
cl.name AS category_default,
DATEDIFF(ps.`date_add`, DATE_SUB(NOW(),INTERVAL 20 DAY)) > 0 AS new,
ps.price AS orderprice
FROM
( select @thisLanguage := 1 ) sqlvars,
ps_product_shop ps
INNER JOIN ps_product p
ON ps.id_product = p.id_product
INNER JOIN ps_category_product cp
ON id_product = cp.id_product
AND cp.id_category = 2
LEFT JOIN ps_product_attribute pa
ON p.id_product = pa.id_product
LEFT JOIN ps_product_attribute_shop pas
ON pa.id_product_attribute = pas.id_product_attribute
AND ps.id_shop = pas.id_shop
AND pas.default_on = 1
LEFT JOIN ps_stock_available stock
ON p.id_product = stock.id_product
AND ps.id_shop = stock.id_shop
AND stock.id_shop_group = 0
AND stock.id_product_attribute = IFNULL(pas.id_product_attribute, 0)
LEFT JOIN ps_product_lang pl
ON p.id_product = pl.id_product
AND ps.id_shop = pl.id_shop
AND pl.id_lang = @thisLanguage
LEFT JOIN ps_image i
ON p.id_product = i.id_product
LEFT JOIN ps_image_shop image_shop
ON i.id_image = image_shop.id_image
AND ps.id_shop = image_shop.id_shop
AND image_shop.cover = 1
LEFT JOIN ps_image_lang il
ON image_shop.id_image = il.id_image
AND il.id_lang = @thisLanguage
LEFT JOIN ps_manufacturer m
ON p.id_manufacturer = m.id_manufacturer
LEFT JOIN ps_category_lang cl
ON ps.id_category_default = cl.id_category
AND cl.id_shop = ps.id_shop
AND cl.id_lang = @thisLanguage
WHERE
ps.id_shop = 1
AND ps.active = 1
AND ps.visibility IN ("both", "catalog")
GROUP BY
ps.id_product
ORDER BY
cp.position ASC
LIMIT
0,8;
Что касается создания индекса нескольких полей как единого индекса, например:
СОЗДАТЬ ИНДЕКС act_id_lang ON ps_category(active, id_category, id_lang, nleft, nright, level_depth);
дайте простое имя индекса... для любой таблицы... со ВСЕМИ ключами, поскольку они будут эффективны в запросе.
person
DRapp
schedule
21.10.2014
Enable the slow query log to troubleshoot bad queries
. Google › Включите журнал медленных запросов, чтобы устранять неполадки с неверными запросами › если возникнут проблемы, спросите здесь. Таким образом, создается впечатление, что вы хотите, чтобы все было сделано за вас, потому что вопрос, который вы задали, не содержит достаточно информации, чтобы помочь вам. Похоже, вам нужно полное решение, а не подсказки о том, как подойти к проблеме. - person N.B.   schedule 21.10.2014EXPLAIN
передSELECT
, чтобы увидеть план выполнения. Вы делаете это из терминала MySQL или PHPMyAdmin (или любого другого графического интерфейса MySQL). Он расскажет вам, что MySQL пытается сделать внутри для выполнения запроса. После этого разместите здесь запросы вместе со структурой таблицы для дальнейшего анализа. - person N.B.   schedule 21.10.2014EXPLAIN
перед выбором вот так:EXPLAIN SELECT
и опубликуйте это обратно. - person N.B.   schedule 21.10.2014