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

Når du tilmelder dig et meget lille/tomt bord, hvorfor laver MySQL en fuld scanning på trods af, at jeg bruger LIMIT?

MySQL optimizeren vil først tage stilling til join-rækkefølge/-metode, og derefter kontrollere, om det for den valgte join-rækkefølge er muligt at undgå sortering ved at bruge et indeks. Til den langsomme forespørgsel i dette spørgsmål har optimeringsværktøjet besluttet at bruge Block-Nested-Loop (BNL) join.

BNL er normalt hurtigere end at bruge et indeks, når en af ​​tabellerne er meget lille (og der er ingen LIMIT).

Men med BNL vil rækker ikke nødvendigvis komme i den rækkefølge, som den første tabel giver. Derfor skal resultatet af sammenkædningen sorteres, før LIMIT'en anvendes.

Du kan slå BNL fra ved at set optimizer_switch = 'block_nested_loop=off';



  1. Opret og brug en midlertidig tabel i indlejrede forespørgsler

  2. Sådan får du en række i SQLite efter indeks (ikke efter id)

  3. Sådan gemmer du data, der indeholder anførselstegn i MySQL

  4. Fjederstøvle JPA indsats i TABLE med store bogstaver med Hibernate