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

Získávání náhodných dat z databáze MySQL, ale neopakování dat

Výběr náhodných řádků je vždy ošemetný a neexistují žádná dokonalá řešení, která by nezahrnovala nějaký kompromis. Buď ohrozte výkon, nebo dokonce náhodné rozdělení, nebo ohrozte možnost výběru duplikátů atd.

Jak zmiňuje @JakeGould, jakékoli řešení s ORDER BY RAND() špatně měřítko. Jak se počet řádků ve vaší tabulce zvětšuje, náklady na řazení celé tabulky v řazení souborů se zhoršují a zhoršují. Jake má pravdu, že dotaz nelze uložit do mezipaměti, když je pořadí řazení náhodné. Ale o to se tolik nestarám, protože obvykle stejně vypnu mezipaměť dotazů (má své vlastní problémy se škálovatelností).

Zde je řešení, jak předem náhodně řadit řádky v tabulce vytvořením sloupce rownum a přiřazením jedinečných po sobě jdoucích hodnot:

ALTER TABLE products ADD COLUMN rownum INT UNSIGNED, ADD KEY (rownum);
SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

Nyní můžete získat náhodný řádek vyhledáváním indexu, bez řazení:

SELECT * FROM products WHERE rownum = 1;

Nebo můžete získat další náhodný řádek:

SELECT * FROM products WHERE rownum = 2;

Nebo můžete získat 10 náhodných řádků najednou nebo jakékoli jiné číslo, které chcete, bez duplicit:

SELECT * FROM products WHERE rownum BETWEEN 11 and 20;

Randomizaci můžete kdykoli změnit:

SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

Náhodné třídění je stále nákladné, ale nyní to nemusíte dělat u každého dotazu SELECT. Můžete to udělat podle plánu, doufejme, že v časech mimo špičku.



  1. Včetně volání funkcí DB v pythonu MySQLdb executemany()

  2. Připojení 64bitové aplikace ke Clarion TopSpeed

  3. Denní zálohování databáze pomocí Cron Job

  4. Vraťte seznam časových pásem podporovaných PostgreSQL