sql >> Database >  >> RDS >> Mysql

Waarom gebruikt MySQL geen index voor een groter dan vergelijking?

Het is waarschijnlijk beter om MySql te laten beslissen over het queryplan. De kans is groot dat een indexscan minder efficiënt is dan een volledige tabelscan.

Er zijn twee datastructuren op schijf voor deze tabel

  1. De tafel zelf; en
  2. De primaire sleutel B-Tree-index.

Wanneer u een query uitvoert, heeft de optimizer twee opties voor toegang tot de gegevens:

SELECT * FROM userapplication WHERE application_id > 1025;

De index gebruiken

  1. Scan de B-Tree-index om het adres te vinden van alle rijen waar application_id > 1025
  2. Lees de betreffende pagina's van de tabel om de gegevens voor deze rijen te krijgen.

De index niet gebruiken

Scan de hele tafel en kies de juiste records.

De beste strategie kiezen

De taak van de query-optimizer is om de meest efficiënte strategie te kiezen om de gewenste gegevens te verkrijgen. Als er veel rijen zijn met een application_id > 1025 dan kan het juist minder efficiënt zijn om de index te gebruiken. Als bijvoorbeeld 90% van de records een application_id > 1025 . heeft dan zou de query-optimizer ongeveer 90% van de bladknooppunten van de b-tree-index moeten scannen en vervolgens ook ten minste 90% van de tabel moeten lezen om de werkelijke gegevens te krijgen; dit zou inhouden dat er meer gegevens van de schijf worden gelezen dan alleen de tabel scannen.



  1. Wat is het beste PostgreSQL High Availability Framework? PAF vs. repmgr vs. Patroni Infographic

  2. Tabellen en problemen maken met de primaire sleutel in Rails

  3. GROUP_CONCAT met limiet

  4. Getallen opmaken door opvulling met voorloopnullen in SQL Server