sql >> Database >  >> RDS >> Mysql

Wanneer wordt de functievolgorde van MySQL ORDER BY RAND() uitgevoerd?

Je hebt gelijk, het zal de ORDER BY toepassen na het verminderen van het aantal rijen met WHERE, GROUP BY en HAVING. Maar het zal ORDER BY vóór LIMIT toepassen.

Dus als je het aantal rijen voldoende filtert, dan kan de ORDER BY RAND() inderdaad bereiken wat je wilt zonder grote prestatie-impact. Er is een legitiem voordeel aan code die eenvoudig en gemakkelijk leesbaar is.

Het probleem komt wanneer je denkt uw query zou de rijen tot iets kleins moeten reduceren, maar na verloop van tijd, naarmate uw gegevens groeien, wordt het aantal rijen dat nodig is om te sorteren weer groot. Aangezien uw zoekopdracht vervolgens LIMIT 10 op het gesorteerde resultaat doet, verbergt u het feit dat u ORDER BY RAND() uitvoert op 500k rijen. Je ziet de prestaties op mysterieuze wijze slechter worden.

Ik heb in mijn boek SQL Antipatterns:Avoiding the Valkuilen bij het programmeren van databases , of in andere antwoorden hier op Stack Overflow:



  1. Hoe exacte decimale waarden te hebben zonder afronding in MySQL

  2. Oracle:Wat doet `(+)` in een WHERE-clausule?

  3. Failover voor PostgreSQL-replicatie 101

  4. Syntaxisaccentuering configureren in SQLcl