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

MySQL:Alternativy k ORDER BY RAND()

AKTUALIZACE 2016

Toto řešení funguje nejlépe pomocí indexovaného sloupce .

Zde je jednoduchý příklad a optimalizované vyhledávací pole označené 100 000 řádky.

OPTIMALIZOVÁNO:300 ms

SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

poznámka k limitní částce :limit 4 a 4/počet(*). 4 musí být stejné číslo. Změna počtu návratů neovlivní tolik rychlost. Benchmark na limitu 4 a limitu 1000 jsou stejné. Limit 10 000 to trvalo až 600 ms

poznámka o připojení :Randomizace pouze id je rychlejší než randomizace celého řádku. Vzhledem k tomu, že musí zkopírovat celý řádek do paměti, pak jej randomizovat. Spojení může být jakákoli tabulka, která je propojena s poddotazem Its, aby se zabránilo prohledávání tabulek.

poznamenejte si klauzuli where :Kde počet omezuje množství výsledků, které jsou randomizovány. Vezme procento výsledků a seřadí je spíše než celou tabulku.

pod dotaz na poznámku :Spojení if doing a extra where klauzulové podmínky je musíte vložit jak do poddotazu, tak do poddotazu. Chcete-li mít přesný počet a stáhnout správná data.

NEOPTIMALIZOVÁNO:1200 ms

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

PROS

4x rychlejší než order by rand() . Toto řešení může pracovat s jakoukoli tabulkou s indexovaným sloupcem.

CONS

Je to trochu složité se složitými dotazy. Potřeba udržovat 2 kódové báze v dílčích dotazech



  1. Potřebujete vždy databázi pro svou aplikaci?

  2. Jak zobrazit řádky, které nejsou přítomny v jiné tabulce v MySQL

  3. Limity kurzoru dotazu Salesforce API

  4. Jak POW() funguje v MariaDB