sql >> Databáze >  >> RDS >> Mysql

Správné indexování při použití operátoru OR

Špatně jste pochopili, jak fungují indexy.

Představte si telefonní seznam (ekvivalent dvousloupcového rejstříku na příjmení jméno, jméno a příjmení). Pokud vás požádám, abyste v telefonním seznamu našli všechny osoby, jejichž příjmení je „Smith“, můžete těžit ze skutečnosti, že jména jsou takto uspořádána; můžete předpokládat, že Smithovi jsou organizováni společně. Ale když vás požádám, abyste našli všechny lidi, jejichž křestní jméno je „John“, nemáte z indexu žádný užitek. Johns může mít jakékoli příjmení, a tak jsou roztroušena po celé knize a vy nakonec budete muset pracně hledat, od obálky k obálce.

Nyní, když vás požádám, abyste našli všechny lidi, jejichž příjmení je „Smith“ NEBO jejichž křestní jméno je „John“, můžete Smithovy najít snadno jako dříve, ale to vám vůbec nepomůže najít Johny. Jsou stále roztroušeny po celé knize a vy je musíte pracně hledat.

Stejné je to s vícesloupcovými indexy v SQL. Index je řazen podle prvního sloupce, poté je řazen podle druhého sloupce v případě rovnosti v prvním sloupci, poté je řazen podle třetího sloupce v případě rovnosti v obou prvních dvou sloupcích atd. Není řazen podle všech sloupců zároveň. Váš vícesloupcový index tedy nepomáhá zefektivnit vaše vyhledávací dotazy, s výjimkou sloupce zcela vlevo v indexu.

Zpět k vaší původní otázce.

Pro každý sloupec vytvořte samostatný index s jedním sloupcem. Jeden z těchto indexů bude lepší volbou než ostatní, a to na základě odhad počtu I/O operací index se použije, pokud je použit.

Moderní verze MySQL mají také několik chytrostí ohledně slučování indexů , takže dotaz může použijte více než jeden index v dané tabulce a poté se pokuste výsledky sloučit. Jinak bývá MySQL omezeno na použití jednoho indexu na tabulku v daném dotazu.

Další trik, který mnoho lidí úspěšně používá, je provést samostatný dotaz pro každý z vašich indexovaných sloupců (který by měl používat příslušný index) a poté UNION výsledky.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Jeden poslední postřeh:pokud zjistíte, že hledáte stejné 'something' přes čtyři pole byste měli znovu zvážit, zda jsou všechna čtyři pole ve skutečnosti totéž, a provinili jste se návrhem tabulky, která porušuje první normální formu s opakujícími se skupinami . Pokud ano, pole1 až pole4 možná patří do jednoho sloupce v podřízené tabulce. Pak je mnohem snazší indexovat a dotazovat:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'


  1. Použití pole DATE jako primárního klíče dimenze data s MySQL

  2. Přejmenování názvu tabulky Amazon RDS na velké písmeno způsobí chybu

  3. Předejte tabulku jako parametr do UDF serveru SQL

  4. Zrušte vnoření pole o jednu úroveň