Autor | Zpráva | ||
---|---|---|---|
ra100 Profil * |
#1 · Zasláno: 23. 8. 2011, 13:35:25
Zdravím vás všetkých.
Mám navigačnú lištu, ktorá zobrazuje písmená abecedy od - a po - z. Nabehnutím myši na ľubovolné písmeno sa zobrazí vysúvací zoznam z údajmi z db podľa príslušného písmena. Teda, nabehnutím napr. na písmeno - f, sa vysunú vśetky záznami z db, začínajúce na písmeno -f atd. Písmen v lište mám 26 a ku každému mám vyhotovený nasledujúci sql príkaz - <ul id="abcd"> <li class="bota"><a href="?uni=a" class="aa">A</a> <?php $sql = 'SELECT id, nazov FROM lb WHERE nazov LIKE "A%"'; include 'incld/urb.php'; ?> </li> <li class="bota"><a href="?uni=b">B</a> <?php $sql = 'SELECT id, nazov FROM lb WHERE nazov LIKE "B%"'; include 'incld/urb.php'; ?> </li>...</ul> ...ďalších 24 záznamov. nasledujúci skript je onen includovaný "urb.php" a zobrazuje dáta vo vysúvacom zozname - <div id="a"> <?php include 'incld/db_connect.php'; $objekt = mysqli_query($db_spojenie, $sql); if(!$objekt) { echo 'No object'; die(); } while($riadok = mysqli_fetch_array($objekt)) { echo '<h2><a href="ub.php?uni='.$riadok['nazov'].'">'.$riadok['nazov'].'</a></h2>'; } ?> </div> Viete si predstavíť nasledujúce vykonanie 26 príkazov a zobrazenie všetkých dát ku každému písmenu z abecedy. Vychádza z toho neuveriteľné zpomalovanie načítania lišty, rádovo 8-10 sekúnd, a to pri ešte malom počte pokusných záznamov v db. Kód je možno jednoduchý a efektívny pri vykonaní jedného príkazu, no v tomto prípade zposobuje monstr a zbytočnú záťaž na db. Vie mi niekto poradiť, alebo dať neakú dobrú radu, ako celé to monśtrum zefektívniť ? Vopred ďakujem vśetkým. p.s - napadlo ma to celé najpr načítať niekde na pozadí do premenných alebo napr. - [pre]$_SESSION(['nazov]['id']);/pre] a potom to pužiť. idem to skúsiť, no netuším, či je to dobrý nápad. |
||
o_O_ Profil * |
#2 · Zasláno: 23. 8. 2011, 14:02:49
Já bych to ukládal do externího souboru a poté jednoduše includoval. Pokud by byla nějaká změna tak by se to mohlo zpracovávat již tam.
|
||
pcmanik Profil |
#3 · Zasláno: 23. 8. 2011, 14:17:53
ra100:
Zrejme tam nemate pouzite indexy, ale aj tak to nieje moc dobre riesenie, o_O radi dobre. |
||
ra100 Profil * |
#4 · Zasláno: 23. 8. 2011, 14:21:31
o_O:
Ano.O to sa idem pokúsiť, no otázka znie, aj keď sa jedná, alebo bude jednať o includovaný, už pripravený súbor, nebude sa celá tá mašinéria roztáčať od znova po kliknutí na ktoré koľvek písmeno, alebo odkaz k nemu pridelený? Treba si uvedomť, že navigačná lišta od -a po -z sa dá vypnúť alebo znova zapnút podľa potrieb uživateľa. |
||
o_O_ Profil * |
#5 · Zasláno: 23. 8. 2011, 14:29:41
ra100:
„Treba si uvedomť, že navigačná lišta od -a po -z sa dá vypnúť alebo znova zapnút podľa potrieb uživateľa.“ Ty soubory budou prostě existovat, jestli je bude chtít nebo ne. A pokaždé, když se přidá / odebere / upraví nějaká položka, tak daný řádek upravíte v souboru taktéž, nic víc za tím hledat netřeba. |
||
ra100 Profil * |
#6 · Zasláno: 23. 8. 2011, 14:30:40
pcmanik:
Ak máš na mysli index v db, tak mám auto_increment id + unikátny key a to isté aj pri položke "nazov". V každom prípade to neviem efektívne využiť bez ďaľšieho zaťažovania db. Ak máš neakú radu alebo nápad, budem vďačný. |
||
ra100 Profil * |
#7 · Zasláno: 23. 8. 2011, 14:33:02
o_O:
Ty soubory budou prostě existovat.... ...ok. popracujem na tom a výsledok dám vedieť. chvíľu to potrvá. |
||
o_O_ Profil * |
#8 · Zasláno: 23. 8. 2011, 14:42:02
ra100:
„Ak máš na mysli index v db, tak mám auto_increment id + unikátny key a to isté aj pri položke "nazov".“ Ano. Co se týče LIKE u MySQL výpisu, ten dosti dotaz zpomaluje, asi bych se mu vyhnul přidáním jednoho sloupce do tabulky (varchar (1)), v kterém by bylo ono začínající písmenko. Možná, že by to z části vyřešilo Váš problém. Mimochodem, o kolika řádcích v databázi tady ~ mluvíme? |
||
ra100 Profil * |
#9 · Zasláno: 23. 8. 2011, 14:46:06
Mimochodem, o kolika řádcích v databázi tady ~ mluvíme?
Rádovo v stovkách. |
||
Tori Profil |
#10 · Zasláno: 23. 8. 2011, 14:50:17 · Upravil/a: Tori
ra100:
„neuveriteľné zpomalovanie načítania lišty, rádovo 8-10 sekúnd“ Potom je chyba ve skriptu. Už jen kdybyste místo 26 dotazů s LIKE použil jeden SELECT id, nazov, SUBSTR(nazov,1,1) ORDER BY nazov edit: Samostatný sloupec s iniciálami, jak radí o_O, bude ale při větším počtu záznamů určitě rychlejší než tohle. |
||
o_O_ Profil * |
#11 · Zasláno: 23. 8. 2011, 14:51:18
ra100:
Sekundový výpis mi netrval ani u tisíců řádků, natož 8-10. Zkuste udělat to, co jsem psal v [#8]. |
||
ra100 Profil * |
#12 · Zasláno: 23. 8. 2011, 18:11:55
Približne 2/3 zrýchlenie som dosiahol nazsledujúcou úpravov -
<?php include 'incld/db_connect.php'; $url = "incld/urb.php.php"; ?> <div id="abc"> <ul id="abcd"> <li class="bota"><a href="?uni=a" class="aa">A</a> <?php $_POST['uni'] = 'a'; include $url; ?> </li> <li class="bota"><a href="?uni=b">B</a> <?php $_POST['uni'] = 'b'; include $url; ?> </li>....</ul> a includnutím urb.php.php <div id="a"> <?php $sql = 'SELECT id, abcd, nazov FROM lb WHERE abcd = "'.$_POST['uni'].'"'; $objekt = mysqli_query($db_spojenie, $sql); if(!$objekt) { echo 'No object'; die(); } while($riadok = mysqli_fetch_array($objekt)) { $_SESSION['nazov'] = $riadok['nazov']; $_SESSION['id'] = $riadok['id']; echo '<h2><a href="urcovanie_bylin.php?uni='.$_SESSION['nazov'].'">'.$_SESSION['nazov'].'</a></h2>'; }?> </div> Prehryziem sa aj cez rady o_O_ a Tori. Zatiaľ ďakujem. |
||
pcmanik Profil |
#13 · Zasláno: 23. 8. 2011, 20:38:50
ra100:
Na tom stplci nazov musis mat FULLTEXT index, potom by sa to malo znazne zrychlit. |
||
ra100 Profil * |
#14 · Zasláno: 24. 8. 2011, 00:00:04
pcmanik:
Ano, nazov ma fulltext. |
||
ra100 Profil * |
#15 · Zasláno: 24. 8. 2011, 00:33:27
...Mám skript, založený na -
$sql = 'SELECT id, abcd, nazov, SUBSTR(nazov,1,1) frst_lett FROM lb ORDER BY nazov'; Je to mix od Tori #10 a o_O_ #8, ďakujem im za ochotu. kde abcd je prvé písmeno názvu - varchar (1). Pomocou $_SESSION['substr_nazov'] = substr($_SESSION['nazov'], 0,1); echo '<a href="" >'.$_SESSION['substr_nazov'] .'</a><br />'; echo '<a href="" >'.$_SESSION['frst_lett'] .'</a><br />'; možem vypísať abcd alebo len prvé písmeno z názvu. Existencia abcd v db sposobuje, že nová navigačná lišta bude tvorená už len existujúcimi prvkami z db. Je to výhoda. No skript pri existencii x záznamov v db vygeneruje X prvých písmen. Može mi niekto poradiť, ako nadstaviť skript tak, aby som vygeneroval len jedno rovnaké existujúce začiatočné písmeno z db, napr. - A, Á, B, C, Č, atd. a nie všetky A,A,A,A, Á,Á,B,B,B, C,CCC,ČČ...? Vopred ďakujem za radu. |
||
Tori Profil |
#16 · Zasláno: 24. 8. 2011, 00:42:15
ra100:
Když už máte sloupec s iniciálami, tak ta funkce v dotazu je nadbytečná: 'SELECT id, abcd, nazov, SUBSTR(nazov,1,1) frst_lett FROM lb ORDER BY nazov'; Ad jen jedno začáteční písmeno: SELECT DISTINCT |
||
ra100 Profil * |
#17 · Zasláno: 24. 8. 2011, 13:30:01
Želám dobrý deň )
Nasledujúci skript zobrazuje správne začiatočné písmená - <ul id="abcd"> <?php include 'incld/db_connect.php'; $sql = 'SELECT DISTINCT abcd FROM lb ORDER BY nazov'; $objekt = mysqli_query($db_spojenie, $sql); if(!$objekt) { echo 'No object'; die(); } while($riadok = mysqli_fetch_array($objekt)) { $_SESSION['abcd'] = $riadok['abcd']; echo '<li class="bota"><a href="?uni='.$riadok['abcd'] .'" class="aa">'.$riadok['abcd'] .'</a>'; ?> </ul> Keď však includnem medzy - ...echo '<div id="a">'; //include 'incld/xyz.php'; echo '</div></li>'...; nasledujúci súbor xyz.php', ktorý má na starosť vybrať záznami z db podľa $_SESSION['abcd'] stane sa to, že mi ostane len jedno A a v ňom záznami začínajúce na A. Zatiaľ, čo prví skript, funguje správne, druhý skript po includnutí mne z neznámych príčin ovplivňuje prvý skript a ten prestáva pracovať správne. Tu je ukáźka skriptu xyz.php - <?php $sql = 'SELECT id, abcd, nazov FROM lb WHERE abcd = "'.$_SESSION['abcd'].'" ORDER BY nazov '; $objekt = mysqli_query($db_spojenie, $sql); if(!$objekt) { echo 'No object'; die(); } while($riadok = mysqli_fetch_array($objekt)) { $_SESSION['id'] = $riadok['id']; $_SESSION['nazov'] = $riadok['nazov']; if(isset($_SESSION['abcd']) == $riadok['abcd']) { echo '<a href="urb?uni='.$riadok['nazov'].'">'.$riadok['nazov'].'</a><br />'; } } ?> Poprosím o cennú radu alebo neaké usmernenie v tomto probléme. Vopred vám všetkým ďakujem. |
||
Tori Profil |
#18 · Zasláno: 24. 8. 2011, 14:27:24
ra100:
Includovaný a hlavní skript používají stejné proměnné, které si navzájem přepisují - vyřešilo by to zabalení kódu z include do funkce (dostane ID, vrátí pole dat). Ale v tomto případě vám stačí jeden dotaz: SELECT abcd, id, nazov FROM lb ORDER BY abcd, nazov Omlouvám se za to SELECT DISTINCT, zapomněla jsem, co vlastně chcete udělat. |
||
ra100 Profil * |
#19 · Zasláno: 24. 8. 2011, 15:34:33
....tak som dorazil do bod, keď je moj problém vyriešený.
skrip sa omedzyl z 26 (a-z0 po sebe opakujúcich sa prednadstavených pripojení do db a výberov z db na jeden, ktorý sa delí podľa existujúcich záznamov v db. V prvom prípade sa jedná o grafickú výhodu, kde nav. lišta (a-z0 je plná a ako grafický prvok dobre dopĺňa stránku. Tam však jej úloha končí už z dobre známych príčin. Druhý skript bude dotvárať stránku graficky rovnako dobre s príbúdajúcim počtom záznamov a hlavne je silne efektívny. Tori Includovaný a hlavní skript používají stejné proměnné... Ano, v includovanom xyz.php som zmenil záakladné premenné ako $sql $sql1 Skript sa rozbehol a začal pracovať ) ...mimochodom ma to mohlo dávno napadnúť. Ešte raz ďakujem o_O_ za logický návrh, ktorý pridá do db iba jeden riadok naviše a v konečom dosledku má vpliv na efektívne spracovanie dotazov v db, a Tori za značné rozšírenie obzoru v oblasti sql a jeho jednoduchého využitia v praxi. Želám krásny deň vám všetkým... |
||
Časová prodleva: 13 let
|
0