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 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 |
#2 · Zasláno: 29. 4. 2020, 20:59:29
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 * |
#3 · Zasláno: 29. 4. 2020, 21:05:30
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 |
#4 · Zasláno: 29. 4. 2020, 21:07:58
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 |
#6 · Zasláno: 29. 4. 2020, 21:28:13
plundr:
„jak zjistím co bude efektivnější?“ Naplníte si tabulku očekávanými daty a změříte i čas. |
||
plundr Profil * |
#7 · Zasláno: 29. 4. 2020, 21:30:05
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 * |
#8 · Zasláno: 29. 4. 2020, 21:33:41
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 * |
#9 · Zasláno: 29. 4. 2020, 21:34:58
zkusím naplnit obsah více aby ta tabulka zabírala víc... a potom ještě zmřím
|
||
Kajman Profil |
#10 · Zasláno: 29. 4. 2020, 21:40:08
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 * |
#13 · Zasláno: 29. 4. 2020, 22:44:20
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 |
||
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. |
||
Časová prodleva: 4 roky
|
0