Autor Zpráva
plundr
Profil *
Ahoj, mám tabulku clanky a mám tam řádek "rubrika" a "vymazano",
mám tento dotaz:
EXPLAIN SELECT * FROM `clanek` WHERE rubrika = 1 AND vymazano = 0 ORDER BY ID DESC LIMIT 20
Vypíše mi to toto:
rows: 20


když ale na rubrika nebo vymazano dám index tak mi to vypíše daleko vícee řádků
rows: 2210


k čemu mi teda jsou indexy, když ej to pomalejší a vyhledává to více než by mělo?


ty obrázky se nezobrazili tak sem dám odkazy:

1. (bez indexu) pasteboard.co/J65mGFg.png
2. (s indexem) pasteboard.co/J65ns3Z.png
Kajman
Profil
Explain není všechno. Jaké jsou časy? (Pro měření časů a vývoj je lepší využít přepínač sql_no_cache.)

Můžete zkusit
analyze table clanek

Tipuji, že ve vymazano jsou skoro samé nuly. Tam pak index moc nepomůže, někdy může uškodit, protože s jiným indexem v kombinaci s limitem to může být rychlejší.

Pokud dotaz tohoto typu děláte hodně často, tak optimální by byl jeden index nad více sloupci (rubrika,vymazano,id).


A explainy je jednodušší sem dát textově, než obrázky, které nefungují hned nebo přestanou fungovat za pár měsíců.
plundr
Profil *
Kajman:
dal jsem index na rubrika, vymazano, a nic se nezměnilo. Ale nad sloupečkem rubrika budu muset mít klíč protože to bude cizí klíč na tabulku s rubrikami. Čekal jsem že to bude rychlejší ale ono to je pomalejší... takže co s tím?
Kajman
Profil
plundr:
dal jsem index na rubrika, vymazano

Proč jste tam nedal index, který jsem radil?
plundr
Profil *
Kajman:
Proč jste tam nedal index, který jsem radil?
Já tam žádné id nemám, mám tam jen ID (PRIMARY), takže jak to mám zasat?
ALTER TABLE `clanek` ADD KEY `id_clrub` (`rubrika`,`vymazano`,`ID`);
?


nic se nezměnilo rows 2210


podle eversql bych měl řidat toto:
ALTER TABLE `clanek` ADD INDEX `clanek_idx_rubrika_vymazano_id` (`rubrika`,`vymazano`,`ID`);
ALTER TABLE `clanek` ADD INDEX `clanek_idx_id` (`ID`);
ten první už tedy mám a ten druhej je primary....
jestli je ten explain jenom odhad jak zjistím kolik tedy vybírá? jak zjistím co bude efektivnější?
Kajman
Profil
plundr:
jak zjistím co bude efektivnější?

Naplníte si tabulku očekávanými daty a změříte i čas.
plundr
Profil *
bez indexů trval dotaz Dotaz trval 0,0020 sekund.
a indexama Dotaz trval 0,0010 sekund.
tak nevím čemu mám teda věřit
tttttttt
Profil *
plundr:
V SQL na velikosti písmen nezáleží, id je totež jako ID, ten index je správný.

Tipuju, že bez indexu databáze začne projíždět řádky podle id. Nejspíš má štěstí a prvních 20 řádků splňuje podmínky, tak má hotovo. Kdyby to tak nebylo, bude index rychlejší. I tak si myslím, že ten index neprochází 2210 řádků, jen zobrazí, že tam jsou. Jaké jsou časy?
plundr
Profil *
zkusím naplnit obsah více aby ta tabulka zabírala víc... a potom ještě zmřím
Kajman
Profil
V manuálu se dočtete, že ten sloupec rows v explainu je odhad (u innodb více nepřesný). Věřte času změřenému s vypnutou sql cache.
plundr
Profil *
takže zde jsou výsledky:

s indexem
Dotaz trval 0,0400 sekund
Dotaz trval 0,0040 sekund
Dotaz trval 0,0030 sekund


bez indexu
Dotaz trval 0,0790 sekund
Dotaz trval 0,0040 sekund
Dotaz trval 0,0030 sekund


po smazání indexu a po přidání indexu jsem bždy vypnul a zapnul php a mysql... poprvé to zabíralo více času a postupně se to ustálilo na 0,0030....
...tak co..... co z toho plyne.


Kajman:
Věřte času změřenému s vypnutou sql cache.
jak to cache vypnu nebo vymažu?
Tomášeek
Profil
plundr:
poprvé to zabíralo více času a postupně se to ustálilo na 0,0030....
Ano, protože cache.

jak to cache vypnu nebo vymažu?
Přečti si, co ti zpětně Kajman psal. Jak cache vypnout už ti Kajman napsal.
plundr
Profil *
Tomášeek:
Přečti si, co ti zpětně Kajman psal. Jak cache vypnout už ti Kajman napsal.
napsal mi: Jaké jsou časy? (Pro měření časů a vývoj je lepší využít přepínač sql_no_cache.)
když napíšu toto:
SELECT SQL_NO_CACHE * FROM `clanek` WHERE rubrika = 1 AND vymazano = 0 ORDER BY ID DESC LIMIT 20
tak se ty následující stejnak zobrazí za 10x menší čas než vždy první
Kajman
Profil
A 3ms se Vám zdají příliš, nebo proč to řešíte? Na normální projekty a mysql to je akceptovatelný čas dotazu.

Pokud je v tabulce málo záznamů (třeba jen 1 nebo 2 tisíce), tak režie na použití indexu může stírat rozdíl v rychlosti mezi dotazem s indexem a hrubém zpracování dotazu. Pokud máte statisíce nebo miliony záznamů a tisíce rubrik, tak by tam už měl být rozdíl patrnější - uvedený dotaz by měl být s vhodným indexem stále skoro stejně rychlý.

Čas prvního dotazu po nastartování databáze Vás tolik nezajímá. Servery beží bez restartu dlouhou dobu.

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