sql >> Databasteknik >  >> RDS >> Mysql

Snabbaste slumpmässiga valet DÄR kolumn X är Y (NULL)

Att få en genuint slumpmässig post kan vara långsam. Det finns egentligen inte mycket att komma runt detta faktum; om du vill att det ska vara riktigt slumpmässigt måste frågan ladda all relevant data för att veta vilka poster den har att välja mellan.

Men lyckligtvis finns det snabbare sätt att göra det på. De är inte riktigt slumpmässiga, men om du gärna byter ut lite ren slumpmässighet mot snabbhet, så borde de vara tillräckligt bra för de flesta ändamål.

Med det i åtanke är det snabbaste sättet att få en "slumpmässig" post att lägga till en extra kolumn i din DB, som är fylld med ett slumpmässigt värde. Kanske en saltad MD5-hash av primärnyckeln? Vad som helst. Lägg till lämpliga index i den här kolumnen och lägg sedan till kolumnen i din ORDER BY klausul i frågan, så får du tillbaka dina poster i slumpmässig ordning.

För att få en enda slumpmässig post, specificera helt enkelt LIMIT 1 och lägg till ett WHERE random_field > $random_value där slumpmässigt värde skulle vara ett värde inom intervallet för ditt nya fält (säg en MD5-hash av ett slumptal, till exempel).

Naturligtvis är nackdelen här att även om dina poster kommer att vara i en slumpmässig ordning, kommer de att fastna i samma slumpmässiga ordning. Jag sa att det var perfektion för handel för frågehastighet. Du kan komma runt detta genom att uppdatera dem regelbundet med nya värden, men jag antar att det kan vara ett problem för dig om du behöver hålla det fräscht.

Den andra nackdelen är att det kan vara för mycket begärt att lägga till en extra kolumn om du har lagringsbegränsningar och din DB redan är enorm i storlek, eller om du har en strikt DBA att komma förbi innan du kan lägga till kolumner. Men återigen, du måste byta ut något; om du vill ha sökhastigheten behöver du denna extra kolumn.

Hur som helst, jag hoppas att det hjälpte.



  1. Hur kan man välja alla poster utom de tre första posterna?

  2. Oracle PL/SQL - samlingar (kapslade tabeller)

  3. C# Remote MySQL - Åtkomst nekad för användare

  4. Jämför DATETIME och DATE ignorerande tidsdel