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.