Оптимизация запроса

Romantik

TeaM PHPClub
Оптимизация запроса

Приветствую.
Вот узкое место в проекте, хотел бы с Вашей помощью оптимизировать на уровне скрипта.

собственно скрипт формирует JS меню:

SELECT * FROM part
while(...)
{
$id_part= $row["id_part"];
echo --формирует ветку РАЗДЕЛОВ

SELECT * FROM group WHERE ind=$id_part
while(...)
{
$id_grp= $row["id_grp"];
// следуюущие выборки как раз и тормозят
// на их основе формируются цвета для меню
SELECT * FROM wares WHERE ind=$id_grp AND qty!=0
$num_qty= numRows(); // получение параметра для меню

SELECT * FROM wares WHERE ind=$id_grp AND usl=1
$num_usl= numRows(); // получение параметра для меню

if($num_qty==0) {$COLOR="RED";} //нет в остатках
else if($num_usl>0) {$COLOR="GREEN";}// услуга
else {$COLOR="BLUE";}// иначе

echo --формирует ветку ГРУПП с получ. параметром $COLOR
}
}
ЗЫ: вопрос об объедеинении в один запрос таблиц part и group не стоит.
 

Falc

Новичок
Romantik
Какой именно запрос тормозит?
Покажи его explain.
 

Romantik

TeaM PHPClub
Да отдельно они не тормозят, просто представь:
part содержит десяток записей
group - сотню
сколько раз в циклах обрабатываются ДВА запроса на wares

ЗЫ: пока хочу оптимизировать на уровне скрипта...
 

Falc

Новичок
Romantik
Ну во-первых чтобы подсчитать кол-во записей лучше использовать COUNT, а не вытаскивать все эти записи.
Ну а потом если не хочешь нагружать сервер, каунты лучше хранить как атрибуты и пересчитывать их при изменении данных, а не каждый раз при выводе.
 

Romantik

TeaM PHPClub
Ну во-первых чтобы подсчитать кол-во записей лучше использовать COUNT, а не вытаскивать все эти записи.
Это когда нет условий. Или я не прав?
Ну а потом если не хочешь нагружать сервер, каунты лучше хранить как атрибуты и пересчитывать их при изменении данных, а не каждый раз при выводе.
в одном случае да, спасибо за совет, в другом случае довольно таки часто меняется.
 

Falc

Новичок
Romantik
>>Это когда нет условий. Или я не прав?
Всегда

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

Falc

Новичок
Romantik
Кстати покажи explain для обоих своих запросов.
 

Фанат

oncle terrible
Команда форума
Romantik по поводу условия - это речь идет о count(*)
то есть count(*) это специальная конструкция, которая действительно при отсутствии условий берет результат из заголовка таблицы.

однако это не повод считать чечез нум ровс во всех остальных случаях.
count(*) с условием сработает медленнее, чем без них, но быстрее в сто раз, чем выбирать данные, передавать их пыху (!) и считать.
 

Romantik

TeaM PHPClub
которая действительно при отсутствии условий берет результат из заголовка таблицы.
ну да, я об этом же

А по поводу передачи я понял, спасибо.

Falk: с explain-ами еще не закончил. Я вообще то думал можно на уровне скрипта сначала решить, а потом баловаться с explain-ом.
 

Falc

Новичок
Romantik
>>Я вообще то думал можно на уровне скрипта сначала решить
Если пунктов меню у тебя очень много и ты хочешь уменьшить кол-во запросов к базе, можно вытащить сначало (перед цыклом) все каунты в масив и потом из массива их дергать
 

chira

Новичок
попробуй так:
Код:
//сначала посчитай в MySQLe
CREATE TEMPORARY TABLE tt AS
 SELECT ind
  ,SUM(IF(qty!=0,1,0)) cnt1
  ,SUM(IF(usl=1,1,0)) cnt2
 FROM wares 
 GROUP BY ind;
//потом объедени все одним SQL
SELECT p.*,q.*,tt.cnt1,tt.cnt2 FROM part p
  LEFT JOIN group g ON p.id_part=g.ind
  LEFT JOIN tt ON g.ind=tt.ind;
получишь один цыкл ...
проверь и сообщи результаты ...
возможно нужно будет добавить индексы (если нет)
 

Falc

Новичок
chira
Я полагаю более быстрым способом будет выбирать не во временую таблуцу , а сразу в масив PHP
 
Сверху