Autor Zpráva
ra100
Profil *
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 *
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
ra100:
Zrejme tam nemate pouzite indexy, ale aj tak to nieje moc dobre riesenie, o_O radi dobre.
ra100
Profil *
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 *
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 *
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 *
o_O:
Ty soubory budou prostě existovat....
...ok. popracujem na tom a výsledok dám vedieť.
chvíľu to potrvá.
o_O_
Profil *
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 *
Mimochodem, o kolika řádcích v databázi tady ~ mluvíme?
Rádovo v stovkách.
Tori
Profil
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
, a změnu prvního písmene ověřoval ve skriptu, tak by se to mělo výrazně zrychlit. Na jednom webu jsem tak dělala vyhledávání podle iniciály, asi 1850 záznamů, při zobrazení jmen od "A" používám taky LIKE "A%" a zobrazuje se to přijatelně rychle. (Žádný šablon.systém ani cache, rovnou echo).
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 *
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 *
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
ra100:
Na tom stplci nazov musis mat FULLTEXT index, potom by sa to malo znazne zrychlit.
ra100
Profil *
pcmanik:
Ano, nazov ma fulltext.
ra100
Profil *
...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
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 *
Ž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
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
. Pak budete procházet řádky, a když se změní hodnota v abcd, tak přidáte i nadpis kategorie. (viz PHP FAQ).
Omlouvám se za to SELECT DISTINCT, zapomněla jsem, co vlastně chcete udělat.
ra100
Profil *
....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
na
$sql1
atd.
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...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0