sql >> Database >  >> RDS >> Mysql

Hoe werkt de ORDER BY RAND() van MySQL?

Hoewel er niet zoiets bestaat als een "snelle bestelling op rand()", is er wel een oplossing voor uw specifieke taak.

Voor het verkrijgen van een willekeurige rij , kun je doen zoals deze Duitse blogger doet:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- case-study-of-alternatives/ (Ik kon geen hotlink-url zien. Als iemand er een ziet, bewerk de link dan gerust.)

De tekst is in het Duits, maar de SQL-code staat een beetje onderaan de pagina en in grote witte vakken, dus het is niet moeilijk te zien.

Wat hij eigenlijk doet, is een procedure maken die het werk doet om een ​​geldige rij te krijgen. Dat genereert een willekeurig getal tussen 0 en max_id, probeer een rij op te halen, en als het niet bestaat, blijf doorgaan totdat je er een vindt die dat wel doet. Hij staat het ophalen van x aantal willekeurige rijen toe door ze op te slaan in een tijdelijke tabel, dus je kunt de procedure waarschijnlijk herschrijven om een ​​beetje sneller te zijn door slechts één rij op te halen.

Het nadeel hiervan is dat als je VEEL rijen verwijdert, en er zijn enorme gaten, de kans groot is dat het vele malen wordt gemist, waardoor het niet effectief is.

Update:verschillende uitvoeringstijden

Het kan te maken hebben met indexering. id is geïndexeerd en snel toegankelijk, terwijl het toevoegen van username naar het resultaat, betekent dat het dat van elke rij moet lezen en in de geheugentabel moet plaatsen. Met de * het moet ook alles in het geheugen lezen, maar het hoeft niet door het gegevensbestand te springen, wat betekent dat er geen tijd verloren gaat met zoeken.

Dit maakt alleen verschil als er kolommen met variabele lengte zijn (varchar/tekst), wat betekent dat het de lengte moet controleren en vervolgens die lengte moet overslaan, in plaats van alleen een ingestelde lengte (of 0) tussen elke rij over te slaan.



  1. Voorbereide instructies gebruiken met mysql in python

  2. gestratificeerde steekproef op bereiken

  3. Verwijder jsonb-array-element op waarde

  4. Veilige manier om bestanden op de webserver op te slaan?