sql >> Databasteknik >  >> RDS >> Mysql

Varför Index används endast när det är påtvingat men inte som standard?

för bättre prestanda kan du prova att använda sammansatt index .. baserat på kolumnen som är involverad i din where-sats
och försöka ändra IN-satsen i en inre join
förutsatt att innehållet i IN-satsen är en uppsättning fasta värden du kan använda union (eller en ny tabell med det värde du behöver)

t.ex. genom att använda unionen (du kan göra något liknande om IN-satsen är en underfråga)

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;

du kan också lägga till ett sammansatt index i tabellen user_table på kolumner

   colA, colB, colC

för vad som är relaterat till element som används av mysql query optimizer för att bestämma indexet för att använda det flera aspekter och för alla dessa tilldelar frågeoptimeraren en kostnad
alla vad du bör ta i beaktande

  • kolumnen som ingår i Where-satsen
  • Storleken på tabellerna (och inte yiuy fallet storleken på tabellerna i join)
  • En uppskattning av hur många rader som kommer att hämtas (för att bestämma om ett index ska användas eller helt enkelt skanna tabellen)
  • om datatyperna matchar eller inte mellan kolumner i jion och where-satsen
  • Användningen av funktions- eller datatypskonvertering inklusive fel vid sortering
  • Storleken på indexet
  • kardinalitet av indexet

och för alla dessa alternativ utvärderas en kostnad och detta leder till att indexet väljer

I ditt fall innebär kolC som datum en datakonvertering (respektera de bokstavliga värdena som sträng ) och för detta är indexet inte valt ..

Är också för detta som jag har föreslagit ett sammansatt index med kolumnen längst till vänster relaterat till icke-konverterade värden



  1. MySQL Lägg till unik begränsning

  2. Kör .sql-fil i Python med MySQLdb

  3. MySQL INTE I fråga

  4. Hur listar man varje tupelpar bara en gång oavsett kolumnordning i SQL och relationalgebra?