[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация запроса
Страницы: 1, 2, 3
olya-kowka
Друзья, прочла все похожие темы о запросах в цикле, но для себя не нашла ответа. Прошу помощи.

Я занимаюсь сейчас оптимизацией кода одного сайта. На сайте идет построение меню слева на странице.

Подробнее:

У меня есть массив типов изделий (20 наименований):
 $types = array(1=>array('name'=>'кольца', ...), 2=>array('name'=>'серьги', ....), ...);


Также есть массив диапазонов цен:
 $prices = array(1=>array('name'=>'до 1500 руб.', 'where_clause'=>' < 1500'), 2=>array('name'=>'от 1500 до 3000', 'where_clause'=>' BETWEEN 1501 AND 3000'), ...);


Хочу для каждого типа изделий определить сколько их в БД по каждому диапазону цен. Для этого работаю в циклах:


foreach ($types as $type=>$vals)
{
foreach ($prices as $price_id=>$price_info)
{
$sql = 'SELECT count(item) FROM table WHERE price '.$prices[$price_id]['where_clause'].' AND type='.$type;

}
}



Соответственно, если запрос возвращает мне 0, то я не вывожу информацию по данному изделию в определенном диапазоне цен.
Работаю в MySQL. Сайт достаточно посещаем. Но мне не нравится работа запроса в цикле, я понимаю, что это зло, но не представляю, как можно реализовать подобную задачу иначе: ведь при загрузке страницы все 20 наименований пробегаются в цикле и каждому надстраивается ряд диапазонов цен. До оптимизации кода предыдущим программистом было написано проще: он просто брал меньшее количество диапазонов цен и наименований изделий и просто по-порядку делал несколько запросов - не в цикле, а подряд. Естесственно, страница загружалась очень быстро. А с моей подобной оптимизацией получается, что страница открывается долго. Потому что и количество значений для подсчета увеличилось.

Как мне быть? unsure.gif

_____________
Столько дел...Не успеваю на все забить!!
qpayct
повезлож кому-то tongue.gif

можно уточнить несколько моментов?
1.откуда собственно берутся эти массивы?
2.как построена бд?
3.сколько платишь за решение?
Nikitian
Тут самое оптимальное будет запросы собрать в union all и закешировать результат. Можно извратиться на джойнах, но это будет именно изврат и прироста производительности не даст. Есть ли индексы и как они расставлены (работают ли при запросах указанного вида)?
Приведите explain типичного запроса.
olya-kowka
Цитата (qpayct @ 21.06.2010 - 10:52)
повезлож кому-то  tongue.gif

можно уточнить несколько моментов?
1.откуда собственно берутся эти массивы?
2.как построена бд?
3.сколько платишь за решение?

повезло в чем? =))


1. Массивы берутся из файлика - они сформированы ручками. Т.к. Бд построена на мой взгляд несколько криво - есть единая таблица main_table, где содержится вся информация:

item - номер изделия
art - артикул
price - цена
type - тип изделия (который в массиве)
brand - название компании

Большая таблица с кучей полей и поэтому никаких join делать не нужно, вся выборка идет только отсюда. Таблица MyISAM, что и понятно, индексы есть на поле item и type.

3. За спасибо!

_____________
Столько дел...Не успеваю на все забить!!
olya-kowka
Nikitian

Explain не могу сейчас привести, немного позже, временные проблемы сервера.... Но обязательно посмотрю, что там и как происходит.


_____________
Столько дел...Не успеваю на все забить!!
qpayct
если я всё правильно понял, там всего 2 уровня получается - категории и товары и тебе надо подсчитать колличество товаров в каждой категории и диапазон цен?
Цитата (olya-kowka @ 21.06.2010 - 13:20)
Большая таблица с кучей полей
или же там всётки мультивложенная иерархия?
olya-kowka
Цитата (qpayct @ 21.06.2010 - 11:40)
если я всё правильно понял, там всего 2 уровня получается - категории и товары и тебе надо подсчитать колличество товаров в каждой категории и диапазон цен?
Цитата (olya-kowka @ 21.06.2010 - 13:20)
Большая таблица с кучей полей
или же там всётки мультивложенная иерархия?

Мне нужно посчитать количество товаров по каждому типу изделий в каждом диапазоне цен.

Нет никакой мультивложенной иерархии. Вся информация в одной таблице!

_____________
Столько дел...Не успеваю на все забить!!
qpayct
и это - оптимизация? ну тогда я тебе не помощник, ссори
olya-kowka
qpayct

мне приходится работать с тем, что есть, я пытаюсь оптимизировать код, потому как в БД мне не дают возможности разрулить все по таблицам и нормализовать! Думаешь, я не осознаю, что все криво сделано?! Меня тоже учили грамотно БД проектировать. Но тут мне нужно понять, как мне с запросами в цикле работать...

_____________
Столько дел...Не успеваю на все забить!!
olya-kowka
Nikitian

Запрос вида:

EXPLAIN SELECT count( idw )
FROM table
WHERE TYPE =1
AND go =1
AND price * disc >0
AND price * disc *27 <1500
AND stoun =1
AND descr LIKE '%брилл%'


Вот в таком виде explain

id 	select_type 	table 	type 	    possible_keys 	        key 	 key_len 	ref 	rows 	Extra 
1 SIMPLE table ref type,go,stoun,type_2 type 2 const 10261 Using where


_____________
Столько дел...Не успеваю на все забить!!
qpayct
чесно говоря я пока не уверен, что речь идёт именно о 2-уровневом каталоге., а то что это одна таблица ещё ничего не значит. может тот кто проектировал это в одной таблице специально так делал для nested sets у меня пока твёрдое впечатление что это именно так.
olya-kowka
как мне объяснили, такое проектирование обусловлено только тем, что запросы из 1 таблицы делаются быстрее, соответственно и инфа обрабатывается и выводится юзеру на экран, нежели, если бы все было нормализовано. Я по началу порывалась все переделать, но мне сказали - не нужно!

_____________
Столько дел...Не успеваю на все забить!!
qpayct
выше ты привела все столбцы таблицы или только часть?

есть ли на самом сайте что-то кроме категорий и товаров? подкатегории допустим?
olya-kowka
я привела только часть полей.


весь сайт базируется на отображение информации по типам изделий, отображение информации этих же изделий по названию Бренда (инфо о бренде - название и номер базируется в этой же таблице, не смотря на то ,что есть отдельная таблица брендов), отображение этих же изделий в зависимости от драг. камней, содержащихся в изделиях. Вот основные 3 кита информации на сайте.

_____________
Столько дел...Не успеваю на все забить!!
qpayct
посмотри, есть ли там в таблице ключи левые и правые. если есть, значит - nested sets.

посмотри, как категории связываются с товарами и повторяю!!!!! есть там что-то между категорий и продуктов? подкатегории? подподкатегории? подподподкатегории?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.