sql >> Databasteknik >  >> RDS >> Mysql

Att hämta slumpmässiga data från en MySQL-databas men inte upprepa data

Att välja slumpmässiga rader är alltid svårt, och det finns inga perfekta lösningar som inte innebär någon kompromiss. Antingen äventyra prestanda, eller äventyra till och med slumpmässig distribution, eller kompromissa med chansen att välja dubbletter osv.

Som @JakeGould nämner, alla lösningar med ORDER BY RAND() skalar inte bra. När antalet rader i din tabell blir större, blir kostnaden för att sortera hela tabellen i en filsortering sämre och sämre. Jake har rätt i att frågan inte kan cachelagras när sorteringsordningen är slumpmässig. Men jag bryr mig inte så mycket om det eftersom jag vanligtvis inaktiverar frågecachen ändå (den har sina egna skalbarhetsproblem).

Här är en lösning för att i förväg randomisera raderna i tabellen genom att skapa en radnummerkolumn och tilldela unika på varandra följande värden:

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();

Nu kan du få en slumpmässig rad genom en indexuppslagning, utan sortering:

SELECT * FROM products WHERE rownum = 1;

Eller så kan du få nästa slumpmässiga rad:

SELECT * FROM products WHERE rownum = 2;

Eller så kan du få 10 slumpmässiga rader åt gången, eller vilket annat nummer du vill, utan dubbletter:

SELECT * FROM products WHERE rownum BETWEEN 11 and 20;

Du kan randomisera om när du vill:

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

Det är fortfarande dyrt att göra den slumpmässiga sorteringen, men nu behöver du inte göra det på varje SELECT-fråga. Du kan göra det enligt ett schema, förhoppningsvis under lågtrafik.



  1. Hantera fel med hög allvarlighet i SQL Server

  2. Hur man infogar rader i SQL Server Table genom att redigera tabellrader GUI - SQL Server / TSQL Tutorial Del 101

  3. säkerhetskonsekvenser av mysql aws-säkerhetsgrupp som inrättats

  4. Hur ska jag skriva PHP $_POST vars i en mysql_query-funktion?