gv0zd
Новичок
Каталог товаров оптимизация запросов
Использовал для своих сайтиков такую структуру каталога
Каталог состоит из:
1.Таблица Категорий (примерно 500 записей) В каждой строке название, описание, вкл/выкл
2. В каждой категории есть товары. Таблица товаров (примерно 7000 записей) В каждой строке название, описание, вкл/выкл
3. У каждого товара может быть несколько модификаций. Таблица модификаций (примерно 12000 записей). В каждой строке название, цена, вкл/выкл
4. У каждой модификации может быть неогр кол-во фотографий. Таблица фотографий (примерно 30 000 записей). Фотографии модификации можно сортировать. Таким образом фотка с минимальным значением параметра сортировки будет "главной". Ее следует грузить в описании модификации
Стоит такая задача:
1. Вывести перечень товаров категории для которых onoff = 1
2. Если у товара нет модификаций с onoff = 1 этот товар выводить ненужно
3. Каждому товару сопоставить модификацию с минимальной ценой.
3. Этой модификации сопоставить фото с минимальным значением sort и onoff = 1
На маленьких таблицах, я извратнулся и написал все это одним диким
запросом. Записей было немного и все худо бедно работало
Но вот с этой таблицей
категория (node_id|title|content|onoff) (500 строк)
--товар (product_id|node|title|content|onoff) (7000 строк)
----модификация (subproduct_id|product|title|price|onoff) (12000 строк)
------фотография (image_id|subproduct|title|extension|sort|onoff) (30000 строк)
Все гораздо хуже 30-40 сек для вывода перечня товаров в категории.
Как поступить оббегать все по нескольку раз в рекурсии? Или можно как-то оптимизировать все это?
Вот дикий
запрос
Использовал для своих сайтиков такую структуру каталога
Каталог состоит из:
1.Таблица Категорий (примерно 500 записей) В каждой строке название, описание, вкл/выкл
2. В каждой категории есть товары. Таблица товаров (примерно 7000 записей) В каждой строке название, описание, вкл/выкл
3. У каждого товара может быть несколько модификаций. Таблица модификаций (примерно 12000 записей). В каждой строке название, цена, вкл/выкл
4. У каждой модификации может быть неогр кол-во фотографий. Таблица фотографий (примерно 30 000 записей). Фотографии модификации можно сортировать. Таким образом фотка с минимальным значением параметра сортировки будет "главной". Ее следует грузить в описании модификации
Стоит такая задача:
1. Вывести перечень товаров категории для которых onoff = 1
2. Если у товара нет модификаций с onoff = 1 этот товар выводить ненужно
3. Каждому товару сопоставить модификацию с минимальной ценой.
3. Этой модификации сопоставить фото с минимальным значением sort и onoff = 1
На маленьких таблицах, я извратнулся и написал все это одним диким

Но вот с этой таблицей
категория (node_id|title|content|onoff) (500 строк)
--товар (product_id|node|title|content|onoff) (7000 строк)
----модификация (subproduct_id|product|title|price|onoff) (12000 строк)
------фотография (image_id|subproduct|title|extension|sort|onoff) (30000 строк)
Все гораздо хуже 30-40 сек для вывода перечня товаров в категории.
Как поступить оббегать все по нескольку раз в рекурсии? Или можно как-то оптимизировать все это?
Вот дикий

PHP:
SELECT * FROM (
SELECT
`n`.`title` as `n_title`
, `p`.*
, `s`.*
FROM
`catalog_nodes` as `n`, `catalog_products` as `p`, (
SELECT
`t1`.`subproduct_id`, `t1`.`product`, `t1`.`price`
FROM
`catalog_subproducts` as `t1`, (
SELECT
`product`, MIN(`t3`.`price`) as `minprice`
FROM
(
SELECT
`product`, `price`
FROM
`catalog_subproducts`
WHERE
`onoff` = 1
) as `t3`
GROUP BY
`product`
) as `t2`
WHERE
`t1`.`product` = `t2`.`product`
AND `t1`.`price` = `t2`.`minprice`
AND `t1`.`onoff` = 1
GROUP BY
`t1`.`product`) as `s`
WHERE
`n`.`node_id` = 43
AND `n`.`node_id` = `p`.`node`
AND `n`.`onoff` = 1
AND `p`.`onoff` = 1
AND `p`.`product_id` = `s`.`product`
ORDER BY
`n_title` ASC
, `p`.`title` ASC) as `z`
LEFT OUTER JOIN (
SELECT
`t1`.`image_id`, `t1`.`subproduct`, `t1`.`s_ext`, `t1`.`b_ext`
FROM
`catalog_images` as `t1`, (
SELECT
MIN(`t3`.`sort`) as `minsort`
FROM
(
SELECT
`subproduct`, `sort`
FROM
`catalog_images`
WHERE
`onoff` = 1
) as `t3`
GROUP BY
`subproduct`
) as `t2`
WHERE
`t1`.`sort` = `t2`.`minsort`
AND `t1`.`onoff` = 1
GROUP BY
`t1`.`subproduct`) as `i`
ON
`z`.`subproduct_id` = `i`.`subproduct`