sql >> Database >  >> RDS >> Mysql

MySQL:waarom verandert de 5e ID in de IN-clausule het queryplan drastisch?

Zoals je hebt laten zien, heeft MySQL twee alternatieve queryplannen voor zoekopdrachten met ORDER BY ... LIMIT n :

  1. Lees alle in aanmerking komende rijen, sorteer ze en kies de n bovenste rijen.
  2. Lees de rijen in gesorteerde volgorde en stop wanneer n kwalificerende rijen zijn gevonden.

Om te beslissen welke de betere optie is, moet de optimizer het filtereffect van uw WHERE-conditie inschatten. Dit is niet eenvoudig, vooral voor kolommen die niet zijn geïndexeerd, of voor kolommen waar waarden gecorreleerd zijn. In jouw geval moet je waarschijnlijk veel meer van de tabel in gesorteerde volgorde lezen om de eerste 25 kwalificerende rijen te vinden dan de optimizer had verwacht.

Er zijn verschillende verbeteringen aangebracht in de manier waarop LIMIT-query's worden afgehandeld, zowel in latere releases van 5.6 (u werkt op een pre-GA-release!), en in nieuwere releases (5.7, 8.0). Ik raad je aan te proberen te upgraden naar een latere versie en te kijken of dit nog steeds een probleem is.

Als u de beslissingen van de queryplanner wilt begrijpen, moet u over het algemeen kijken naar de optimalisatietracering voor de query.



  1. Hoe parallelle plannen opstarten - deel 4

  2. Nieuwe kolom toevoegen aan WordPress-database

  3. Verzamelmethode:Trimprocedure in Oracle Database

  4. Mysql, Wijziging veldwaarde controleren?