Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum wird der Index nur verwendet, wenn er erzwungen wird, aber nicht standardmäßig?

Für eine bessere Leistung können Sie versuchen, einen zusammengesetzten Index .. basierend auf der Spalte zu verwenden, die in Ihrer where-Klausel enthalten ist
und versuchen, die IN-Klausel in einem inneren Join zu ändern
unter der Annahme, dass der Inhalt Ihrer IN-Klausel ein Satz fester Werte ist Sie könnten Union verwenden (oder eine neue Tabelle mit dem Wert, den Sie benötigen)

B. die Union verwenden (Sie können etwas Ähnliches tun, wenn die IN-Klausel eine Unterabfrage ist)

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;

Sie könnten auch einen zusammengesetzten Index für die Tabelle user_table für die Spalten

hinzufügen
   colA, colB, colC

Für das Element, das vom MySQL-Abfrageoptimierer verwendet wird, entscheiden Sie, ob der Index dort mehrere Aspekte verwendet, und für alle diese weist der Abfrageoptimierer Kosten zu
alles, was Sie berücksichtigen sollten

  • die in der Where-Klausel enthaltene Spalte
  • Die Größe der Tabellen (und nicht etwa die Größe der Tabellen im Join)
  • Eine Schätzung, wie viele Zeilen abgerufen werden (um zu entscheiden, ob ein Index verwendet oder einfach die Tabelle gescannt werden soll)
  • ob die Datentypen zwischen den Spalten in der jion- und where-Klausel übereinstimmen oder nicht
  • Die Verwendung von Funktions- oder Datentypkonvertierungen, einschließlich fehlerhafter Sortierung
  • Die Größe des Indexes
  • Kardinalität des Indexes

und für alle diese Optionen wird ein Preis berechnet und dies führt zum Index wählen Sie

In Ihrem Fall könnte das colC als Datum eine Datenkonvertierung implizieren (beachten Sie die Literalwerte als Zeichenfolge) und dafür ist der Index nicht ausgewählt ..

Aus diesem Grund habe ich auch einen zusammengesetzten Index vorgeschlagen, bei dem sich die Spalte ganz links auf nicht konvertierte Werte bezieht