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

Proč se index používá pouze při vynucení, ale ne ve výchozím nastavení?

pro lepší výkon můžete zkusit použít složený index .. na základě sloupce zahrnutého ve vaší klauzuli where
a zkusit změnit klauzuli IN ve vnitřním spojení
za předpokladu, že obsah klauzule IN je sada pevných hodnot můžete použít union (nebo novou tabulku s hodnotou, kterou potřebujete )

např. pomocí sjednocení (můžete udělat něco podobného, ​​pokud je klauzule IN poddotaz)

select user_table.colA ,ColB , count(*) as count 
from user_table 
INNER JOIN  ( 
  select 'FIXED1' colA
  union
  select 'FIXED2'
  ....
  union 
  select 'FIXEDX'
  )  t on t.colA = user_table.colA  
where colC >='2019-09-01 00:00:00' 
      and ColB = 17  
group by colA ,ColB;

můžete také přidat složený index do tabulky user_table na sloupcích

   colA, colB, colC

pro to, co souvisí s prvkem používaným optimalizátorem dotazů mysql, pro rozhodnutí indexu použít několik aspektů a pro všechny tyto aspekty optimalizátor dotazů přiřadí cenu
jakékoli, co byste měli vzít v úvahu

  • sloupec zahrnutý v klauzuli Where
  • Velikost tabulek (a nikoli velikost tabulek ve spojení)
  • Odhad, kolik řádků bude načteno (pro rozhodnutí, zda použít index, nebo jednoduše prohledat tabulku)
  • zda se datové typy shodují nebo neshodují mezi sloupci v klauzuli jion a where
  • Použití konverze funkcí nebo datových typů včetně nesprávného řazení
  • Velikost indexu
  • kardinalita indexu

a pro všechny tyto možnosti je vyhodnocena cena a to vede k indexu zvolit

Ve vašem případě by colC jako datum mohlo implikovat konverzi dat (respektujte doslovné hodnoty jako řetězec ) a proto není zvolen index ..

Proto jsem také navrhl složený index se sloupcem nejvíce vlevo souvisejícím s nepřevedenými hodnotami



  1. Jak nejlépe využít funkci komentářů v MySQL

  2. PHP Rotace a přidávání do pole

  3. Jak získat nejnovější 2 položky na kategorii v jednom výběru (s mysql)

  4. Sečtěte výsledky několika dotazů a najděte 5 nejlepších v SQL