sql >> Database >  >> RDS >> Mysql

Willekeurige gegevens uit een MySQL-database halen, maar geen gegevens herhalen

Het selecteren van willekeurige rijen is altijd lastig, en er zijn geen perfecte oplossingen die geen compromis met zich meebrengen. Ofwel compromitteert de prestaties, of compromitteert zelfs willekeurige distributie, of compromitteert de kans op het selecteren van duplicaten, enz.

Zoals @JakeGould vermeldt, elke oplossing met ORDER BY RAND() schaalt niet goed. Naarmate het aantal rijen in uw tabel groter wordt, worden de kosten van het sorteren van de hele tabel in een filesort steeds slechter. Jake heeft gelijk dat de zoekopdracht niet in de cache kan worden opgeslagen als de sorteervolgorde willekeurig is. Maar dat kan me niet zoveel schelen, omdat ik de querycache meestal toch uitschakel (deze heeft zijn eigen schaalbaarheidsproblemen).

Hier is een oplossing om de rijen in de tabel vooraf willekeurig te maken door een rijnummerkolom te maken en unieke opeenvolgende waarden toe te wijzen:

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 kun je een willekeurige rij krijgen door een index-lookup, zonder sorteren:

SELECT * FROM products WHERE rownum = 1;

Of je kunt de volgende willekeurige rij krijgen:

SELECT * FROM products WHERE rownum = 2;

Of je kunt 10 willekeurige rijen tegelijk krijgen, of elk ander nummer dat je wilt, zonder duplicaten:

SELECT * FROM products WHERE rownum BETWEEN 11 and 20;

U kunt op elk gewenst moment opnieuw randomiseren:

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

Het is nog steeds kostbaar om de willekeurige sortering uit te voeren, maar nu hoeft u dit niet bij elke SELECT-query te doen. Je kunt het volgens een schema doen, hopelijk in de daluren.



  1. Manieren om toegang te krijgen tot Oracle Database in PostgreSQL

  2. Foreach of For - dat is de vraag

  3. postgresql externe sleutel syntaxis

  4. Tel het aantal records dat door groep is geretourneerd door