sql >> Database >  >> RDS >> Mysql

Waarom wordt Index alleen gebruikt als het wordt geforceerd, maar niet standaard?

voor betere prestaties kunt u proberen samengestelde index te gebruiken .. gebaseerd op de kolom die betrokken is bij uw waar-clausule
en probeer de IN-clausule in een inner join te wijzigen
ervan uitgaande dat de inhoud van uw IN-clausule een set vaste waarden is je zou unie kunnen gebruiken (of een nieuwe tabel met de waarde die je nodig hebt)

bijv. de unie gebruiken (u kunt iets soortgelijks doen als de IN-clausule een subquery is)

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;

je zou ook een samengestelde index kunnen toevoegen aan de tabel user_table op kolommen

   colA, colB, colC

voor wat gerelateerd is aan het element dat wordt gebruikt door mysql query-optimizer om de index te bepalen om daar verschillende aspecten te gebruiken en voor al deze wijst de query-optimizer kosten toe
alles waar u rekening mee moet houden

  • de kolom betrokken bij Where-clausule
  • De grootte van de tabellen (en niet de grootte van de tabellen in join)
  • Een schatting van het aantal rijen dat wordt opgehaald (om te beslissen of u een index wilt gebruiken of gewoon de tabel wilt scannen)
  • of de datatypes al dan niet overeenkomen tussen kolommen in de jion en where-clausule
  • Het gebruik van functie- of gegevenstypeconversie, inclusief onjuiste sortering
  • De grootte van de index
  • kardinaliteit van de index

en voor al deze opties wordt een kostprijs geëvalueerd en dit leidt tot de index kies

In uw geval zou de colC als datum een ​​dataconversie kunnen zijn (respecteer de letterlijke waarden als string ) en hiervoor is de index niet gekozen ..

Is ook hiervoor dat ik een samengestelde index heb voorgesteld met de meest linkse kolom gerelateerd aan niet-geconverteerde waarden



  1. ondersteunt node-postgres meerdere resultatensets

  2. Database-ontwerp voor apps die hashtags gebruiken

  3. Wat is de juiste syntaxis voor partitionering in SQL?

  4. Oracle:subquery gebruiken in een trigger