sql >> Database >  >> RDS >> Mysql

Waarom mysql de index raakt wanneer kolomomloop met datumfunctie?

Het EXPLAIN-rapport staat bekend als moeilijk te interpreteren. Ze hebben te veel informatie in een paar velden overbelast. Je zou kunnen proberen

Het type: index geeft aan dat het een index-scan aan het doen is , wat betekent dat het elk item in de index bezoekt.

Dit bezoekt hetzelfde aantal items als een tabelscan, behalve dat het tegen een secundaire index is in plaats van de geclusterde (primaire) index.

Wanneer we type: index . zien , EXPLAIN toont possible_keys: NULL wat betekent dat het geen enkele index kan gebruiken om efficiënt te zoeken. Maar het toont ook key: add_time wat betekent dat de index die het gebruikt voor de index-scan add_time is .

De index-scan is te wijten aan het feit dat MySQL zelf expressies of functie-aanroepen niet kan optimaliseren. Als u bijvoorbeeld zou proberen te zoeken naar datums met een specifieke maand, zou u kunnen zoeken naar month(add_time) = 4 maar dat zou de index op add_time niet gebruiken omdat de datums met die maand verspreid zijn door de index, niet allemaal gegroepeerd.

Je weet misschien dat date(add_time) zou door de index moeten kunnen worden doorzocht, maar MySQL maakt die conclusie niet. MySQL ziet alleen dat je een functie gebruikt en probeert niet eens de index te gebruiken.

Daarom introduceerde MySQL 5.7 gegenereerde kolommen om ons in staat te stellen een uitdrukking te indexeren, en MySQL 8.0 maakte het nog beter door een index naar gedefinieerd voor een uitdrukking zonder dat we eerst een gegenereerde kolom moeten definiëren.



  1. mysql hoe een kolom van elke rij bij te werken met een bepaalde set waarden

  2. Een zeer beschikbare canvas LMS implementeren met een PostgreSQL-databasecluster

  3. ld:bibliotheek niet gevonden voor -lzstd tijdens installatie van bundel voor mysql2 gem Ruby op macOS Big Sur 11.4

  4. Moeten SQL-verbindingen die met PDO in PHP zijn geopend, worden gesloten?