Autor Zpráva
stoker
Profil
Zdravim,

mam tabulku s nekolika sloupci, ktera obsahuje statisice radku.

EXPLAIN SELECT sloupec1 FROM tabulka WHERE (sloupec1 = 123 OR sloupec2 = 123) AND sloupec3='1' AND sloupec4='1' AND sloupec5='1'
zobrazi, ze prikaz prosel pri hledani cca 400tis. radku

EXPLAIN SELECT sloupec1 FROM tabulka WHERE sloupec1 = 123 AND sloupec3='1' AND sloupec4='1' AND sloupec5='1'
nebo
EXPLAIN SELECT sloupec1 FROM tabulka WHERE sloupec2 = 123 AND sloupec3='1' AND sloupec4='1' AND sloupec5='1'
zobrazi, ze prikaz prosel cca 100 radku.

vsechny pouzite sloupce jsou indexovane.

Tusite nekdo, jak docilit toho, aby 1. prikaz neprochazel tech radku tolik?

diky
Zechy
Profil
Mám takej pocit, že při zadání SELECTu projede všechny řádky a ty pak porovnává se zadanýma podmínka, je to jako by si v databázi na papíře hledal co potřebuješ dle zadaných podmínek, taky potřebuješ projet všechny data jestli odpovídají zadaným podmínkám.
Tori
Profil
stoker:
Na kterých sloupcích jsou indexy? Nepomohl by třeba společný index přes sloupce 3+4+5?
stoker
Profil
Zechy:
v tom pripade by ale pocty prochazenych radku byly stejne u vsech trech prikazu. sloupce jsou indexovane, podle me vybira jenom ty data, ktere splnuji podminky, ale neni mi jasne, cemu vadi to OR.

Tori:
indexy jsou na vsech 5ti sloupcich zvlast, zadny spolecny.
a co spolecny index 1+2+3+4+5 ? nebylo by to lepsi?
Tori
Profil
stoker:
Já to brala podle toho, že 3+4+5 spojujete pomocí AND, takže by tam mohl být jeden index (vlastně porovnáváte jakoby concat(col3, col4, col5) = concat('hodnota3', 'hodnota4', 'hodnota5'), kdežto u 1 a 2 může být vyhovující hodnota v kterémkoli z nich, takže mi tam připadají vhodnější samostatné indexy. Ale neříkám to ze skušenosti -> zkuste oboje. :)
Tomáš K..
Profil *
Samostatné indexy jsou nepříliš užitečné, což se i ukauzje. Složený na 3,4,5 pomůže, budou se pak procházet jen záznamy, které splní tyto tři podmínky. Na milionu řádku a náhodně generovaných hodnotách 1-10 ve všech sloupcích už dotaz prochází 1700 řádků, trvá 0.01sec.

Další zrychlení by mohly přinést složené indexy na (1,3,4,5) a (2,3,4,5) a přepsání do tvaru
SELECT sloupec1 FROM tabulka WHERE (sloupec2 = 3 AND sloupec3='1' AND sloupec4='1' AND sloupec5='1') OR (sloupec1 = 3 AND sloupec3='1' AND sloupec4='1' AND sloupec5='1');
V takovém případě se řádky najdou v indexech a výsledky slijí dohromady, což může a nemusí být rychlejší.

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: