Помогите пожалуйста с оптимизацией кода..

Dreamer76

Through thorns
Помогите пожалуйста с оптимизацией кода..

Господа. Ниже приведен код, который выводит перечень типов машин и количество единиц техники в каждом типе. Код работает, но сильно тормозит. Записей по фирме - 4000.

Очень прошу совета по оптимизации.

С уважением..


PHP:
<?

	$sql = "SELECT firm.idf, firm.name, model.idf, model.idm, model.idt, tip.idt, tip.tip1, tip.tip2, unit.idm
FROM firm, model, tip, unit
WHERE model.idf = $firma AND model.idf = firm.idf and tip.idt = model.idt
GROUP  BY tip.idt
ORDER  BY  tip.idt ASC";
	$result = mysql_query($sql);

	$result3 = mysql_query($sql);

	$row3 = mysql_fetch_object($result3);
	$dd3 = $row3->name;

	
?>



            
<table align=center width=100% border=0 cellpadding=4 cellspacing=4>
<tr>
	<td bgcolor=black class=menu><font color=orange>ТИПЫ ПО ФИРМЕ</font> | Фирма: <? echo $dd3; ?>  <hr size=1></td>
</tr>
<tr>
	<td class=menu1 width=50% nowrap>



		<table border=0 cellspacing=3 width=100% cellpadding=3>
		<tr>
		<td bgcolor=#454545 class=menu>Типы</td>
		<td width=50 nowrap bgcolor=#454545 align=center class=menu>Единиц</td>
		</tr>

<?
while ($row = mysql_fetch_array($result,MYSQL_ASSOC)) :
?>


<?

	$kolf = $row["idt"];


	$sql2 = "select model.idm, 
		  model.idt,
		  unit.idm,
		  model.idf,
		  unit.uniq from model, unit 
		  where model.idt = $kolf and model.idf = $firma and model.idm = unit.idm group by unit.uniq";
	$result2 = mysql_query($sql2); 

	$rez2 = mysql_num_rows($result2);


?>



		<tr>
		<td class=menu1 bgcolor=silver><b><font color=maroon><a href=index.php?page=models4&firm=<?print($row['idf']);?>&tip=<?print($row['idt']);?> class=menu1><? print($row['tip1']);?><br><? print($row['tip2']);?></a></font></td>
		<td class=menu1><? echo $rez2; ?></td>
		</tr>


<?
endwhile;
?>

		</table>
</td>
</tr>
</table>
 

Groove

Новичок
1) Столько кода не надо было
2) Когда задаешь вопрос по оптимизации , не плохо было бы предоставить код создания таблиц, вместо HTML-кода...
типа CREATE TABLE mark ...
Так дела пойдут гораздо быстрее...
 

Фанат

oncle terrible
Команда форума
Groove
да при чём здесь код таблиц?
ясно же, что у него совершенно чудовищный второй запрос, который запрашивает гору всего и потом делается MYSQL_NUM_ROWS(!!!)

оптимизация очевидна - добавить count в первый запрос, и ВСЁ
 

Dreamer76

Through thorns
array_count_values ?

-~{}~ 14.06.05 12:53:

Понял. count(*).
вопрос. почему именно в 1 select?

у меня же цикл работает.

-~{}~ 14.06.05 13:02:

В верхнем select у меня выбираются типы соответвующие выбранной фирме.

А во втором select у меня выводятся эти типы и к каждому приписывается количество единиц соотв. каждому типу.

Разве можно объедитить их в 1 select??
 

Фанат

oncle terrible
Команда форума
"во втором селект" у тебя даже строка из базы не выбирается.
то есть типы выводятся из ПЕРВОГО.
ты сам не понимаешь, как у тебя программа работает
 

Dreamer76

Through thorns
да. второй селект для того, чтобы посчитать количество единиц в типе, который выбирается в 1 селекте.

-~{}~ 14.06.05 14:06:

Фанат. второй селект надо убрать. а в первый вставить [count as переменная]. а в цикле вместо $rez поставить эту переменную. так?

-~{}~ 14.06.05 14:16:

Люди. Помогите пожалуйста. Единственная проблема, которая осталась нерешенной :(

-~{}~ 14.06.05 15:38:

:(

-~{}~ 14.06.05 16:19:

сделал так:

$sql = "SELECT count(unit.idm) as units_count, firm.idf, firm.name, model.idf, model.idm, model.idt, tip.idt, tip.tip1, tip.tip2
FROM firm
INNER JOIN model ON model.idf = firm.idf
INNER JOIN tip ON tip.idt = model.idt
LEFT JOIN unit ON unit.idm = model.idm
WHERE firm.idf = $firma
GROUP BY tip.idt
ORDER BY tip.idt";

-~{}~ 14.06.05 16:19:

и все :)
 
Сверху