sql >> Database >  >> RDS >> Mysql

Waarom maakt MySQL een volledige scan als ik deelneem aan een zeer kleine/lege tabel, ondanks dat ik LIMIT gebruik?

De MySQL-optimizer beslist eerst over de samenvoegvolgorde/-methode en controleert vervolgens of het voor de gekozen samenvoegvolgorde mogelijk is om sorteren te vermijden door gebruik te maken van een index. Voor de trage zoekopdracht in deze vraag heeft de optimizer besloten om Block-Nested-Loop (BNL) join te gebruiken.

BNL is meestal sneller dan het gebruik van een index wanneer een van de tabellen erg klein is (en er is geen LIMIT).

Bij BNL komen rijen echter niet noodzakelijkerwijs in de volgorde van de eerste tabel. Daarom moet het resultaat van de join worden gesorteerd voordat de LIMIT wordt toegepast.

U kunt BNL uitschakelen door set optimizer_switch = 'block_nested_loop=off';



  1. kan postgres niet herstarten op mac os x

  2. Syntaxisaccentuering configureren in SQLcl

  3. Gebruik variabele ingesteld door psql meta-commando in DO-blok

  4. De laatste N rijen in de database op volgorde krijgen?