sql >> Database teknologi >  >> RDS >> Mysql

MySQL bruger forskelligt indeks afhængigt af grænseværdi med ORDER BY forespørgsel

Sådan går tingene. Bær over med mig et øjeblik...

Optimizeren vil gerne bruge en INDEX, i dette tilfælde ACTI_DATE_I. Men den ønsker ikke at bruge det, hvis det ville være langsommere.

Plan A:Brug indekset.

  1. Nå ind i det BTree-strukturerede indeks i slutningen (på grund af DESC)
  2. Scan baglæns
  3. For hver række i indekset skal du slå den tilsvarende række op i dataene. Bemærk:Indekset har (ACTIVITY_DATE, ACTIVITY_ID), fordi den PRIMÆR NØGLE er implicit tilføjet til enhver sekundær nøgle. At nå ind i "dataene" ved hjælp af PK'en (ACTIVITY_ID) er et andet BTree-opslag, potentielt tilfældigt. Derfor er det potentielt langsomt. (Men ikke særlig langsom i dit tilfælde.)
  4. Dette stopper efter LIMIT rækker.

Plan B:Ignorer tabellen

  1. Scan tabellen, opbyg en tmp-tabel. (Sandsynligvis i hukommelsen.)
  2. Sorter tmp-tabellen
  3. Træl LIMIT rækker af.

I dit tilfælde (96 -- 1 % af 10K) er det overraskende, at den valgte tabelscanningen. Normalt er cutoff et sted omkring 10 %-30 % af antallet af rækker i tabellen.

ANALYZE TABLE skal har forårsaget en genberegning af statistikken, hvilket kunne har overbevist det om at gå med den anden plan.

Hvilken version af MySQL bruger du? (Nej, jeg kender ikke til nogen ændringer på dette område.)

En ting du kan prøve:OPTIMIZE TABLE ACTIVITIES; Det vil genopbygge bordet og derved pakke blokkene igen og føre til potentielt forskellige statistikker. Hvis det hjælper, vil jeg gerne vide det -- da jeg normalt siger "Optimer tabel er ubrugelig".




  1. Mysql oprette tabel med flere fremmednøgler på delete sæt null

  2. Sådan kopieres SQL Server-databaser fra en instans til en anden

  3. Hvordan bruger man forberedt erklæring til udvalgte forespørgsler i Java?

  4. FEJL! Serveren afsluttede uden at opdatere PID-fil (/usr/local/var/mysql/`brugernavn`.lan.pid)