sql >> Databáze >  >> RDS >> Mysql

Jak funguje ORDER BY RAND() MySQL?

I když neexistuje nic takového jako „rychlá objednávka pomocí rand()“, existuje řešení pro váš konkrétní úkol.

Pro získání libovolného náhodného řádku , můžete to udělat jako tento německý blogger:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- případová studie alternativ/ (Nevidím adresu URL horkého odkazu. Pokud ji někdo uvidí, můžete odkaz upravit.)

Text je v němčině, ale kód SQL je o něco níže na stránce a ve velkých bílých polích, takže není těžké ho vidět.

V podstatě to, co dělá, je vytvořit proceduru, která dělá práci získání platného řádku. To vygeneruje náhodné číslo mezi 0 a max_id, zkuste načíst řádek, a pokud neexistuje, pokračujte, dokud nenarazíte na to, které ano. Umožňuje načíst x počet náhodných řádků jejich uložením do dočasné tabulky, takže pravděpodobně můžete přepsat postup tak, aby byl o něco rychlejší a načítal pouze jeden řádek.

Nevýhodou toho je, že pokud smažete HODNĚ řádků a jsou tam velké mezery, je velká šance, že to tunykrát vynechá, takže to bude neúčinné.

Aktualizace:Různé doby provádění

Může to souviset s indexováním. id je indexovaný a rychle přístupný, zatímco přidává username na výsledek, znamená, že to potřebuje přečíst z každého řádku a vložit jej do tabulky paměti. S * také musí vše načíst do paměti, ale nemusí přeskakovat datový soubor, což znamená, že hledáním neztrácíte čas.

To je rozdíl pouze v případě, že existují sloupce s proměnnou délkou (varchar/text), což znamená, že je třeba zkontrolovat délku a poté tuto délku přeskočit, na rozdíl od pouhého přeskočení nastavené délky (nebo 0) mezi každým řádkem.



  1. Rychlost replikace MySQL

  2. PHP MySql (1045) Přístup odepřen pro uživatele

  3. Jak vyřešit ORA-29471 na dbms_sql.open_cursor?

  4. Vyhledávání na částečných IP adresách uložených jako celá čísla