<SELECT для большого количества пунктов

12
PN
На сайте с 01.05.2008
Offline
113
923

У меня есть многоуровневая структура каталога.

напрмиер типа

Строительство->Дома->Красивые->Зеленые

и.т.д.

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

Уже 800 категорий. Выстраивается дерево (по типу примера выше) и выводится в поле SELECT.

Как это все дело правильно закешировать т.к. получается большая нагрузка и медленно выполняется. И к тому же при переборе значение идет проверка на "selected'.

<select name="cat" style="width:320px">';


#----




if (isset($_POST['cat']) && $_POST['cat'] != '' ) {
$cat = $_POST['cat'];}

$sql = "SELECT c.*, cv.cat_val_id, cv.cat_val_name, cv.cat_val_title, cv.cat_val_title_inpage, cv.cat_val_allow_submit_page
FROM catalog AS c
LEFT JOIN catalog_value AS cv ON c.cat_id = cv.cat_val_id
ORDER BY cat_tree ASC, cat_val_title ASC, cat_id ASC";

$res = mysql_query($sql);

while($row=mysql_fetch_assoc($res)){

if($cat==$row['cat_id']){ $selected='selected="selected"'; } else {$selected='';};

if($row['cat_val_allow_submit_page']!='0') {$disabled=' disabled'; } else {$disabled='';};

echo '<option value="'.$row['cat_id'].'" '.$selected.'> '.select_category_tree('cat_page',$row['cat_id'],$cat_page_lang,'','form_list2').' <i>'.$row['cat_val_title'].'</i></option>';



};//while
#----




echo '</select>
texnicii
На сайте с 12.11.2009
Offline
77
#1

попробуйте избавиться от LEFT JOIN это снизит нагрузку

Улыбающийся подшипник на краю подводного плавания.
A
На сайте с 19.07.2010
Offline
130
#2

если тупо(эффективно :) ) и в лоб, то просто закешируйте, результат sql и будет вам счастье.

код примерно такой, когда-то писал похожее для себя...


// $cache - время жизни кеша в часах
// $tmpfile - файл кеша

if(file_exists($tmpfile) && filemtime($tmpfile)<(time()-($cache*3600)) ){
$res=unserialize(file_get_contents($tmpfile));
}else{
$res = mysql_query($sql);
$fp = fopen($tmpfile, 'w'); fwrite($fp, serialize($res)); fclose($fp);
}

сейчас я код копировал/набирал в браузере, так что возможны опечатки, проверяйте..

ps: если кому чего посложнее нужно закешировать - обращайтесь :)

pss: если вас "радует" скорость загрузки кучи тяжелых явовых скриптов типа jquery и прочих прибамбасов, то тоже есть решение.

.............
D5
На сайте с 01.06.2004
Offline
51
#3

Банально, но все же: проверьте есть ли индексы на полях c.cat_id и cv.cat_val_id

А сколько записей в каталоге если категорий 800?

Программирование сайтов (http://lindir.ru)
PN
На сайте с 01.05.2008
Offline
113
#4

Это только категорий 800, а записей пока нет. Новый проект.

Касательно кеширвоаня - делается ADODB кеширование ( по сути тоже самое что admak написал). Но все равно тупит. Возможно тупит еще потому, что показывается полное дерево в селеткте.

Left join - нужно, т.к. в одном одни значения, в другом другие. (странно но когда я все это дело писал, я не хотел разбивать базы, но мне порекомендовали что так быстрее.. а тут вот обратное ? )

D5
На сайте с 01.06.2004
Offline
51
#5

Хм, нет записей и тупит? А тупит это сколько по времени?

С таким кол-вом записей все по идее должно мгновенно работать даже без индексов. Если только объемы самих данных большие.

A
На сайте с 19.07.2010
Offline
130
#6
Prosto_niki:
Касательно кеширвоаня - делается ADODB кеширование ( по сути тоже самое что admak написал). Но все равно тупит. Возможно тупит еще потому, что показывается полное дерево в селеткте.

а вы проверьте, действительно ли оно работает.

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

PN
На сайте с 01.05.2008
Offline
113
#7

Я не знаю как это сделать. Как засечь отдельные фрагменты....

У меня есть только таймер на общую загрузку... И то сдертый :)

A
На сайте с 19.07.2010
Offline
130
#8


$t1=akk_mtime(); // получаем текущее время
// -- какой-то код --

$t2=akk_mtime()-$t1; // $t2 = текущее время - начальное время

сама функция


function akk_mtime(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }
firefox19
На сайте с 05.11.2009
Offline
34
#9

попробуйте воспользоваться mysql EXPLAIN:

http://dev.mysql.com/doc/refman/5.0/en/explain.html

Ваши идеи - наша работа (http://yaweb.ru) Продам Сайт агентства недвижимости (/ru/forum/561489)
PN
На сайте с 01.05.2008
Offline
113
#10

Я тут счетчик запрсоов поставил. Оказалось 1786 Запросов. Это похожу уж очень дофига)

Кешируется при этом Cache: 1782. (остальны запросы не по теме... )

Даже не знаю.... Может тогда лучше от ДЕРЕВОВИДНОГО вывода отказаться?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий