WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL-fråga 2, vad går snabbast? (https://www.wn.se/forum/showthread.php?t=1051745)

znap 2012-01-07 15:04

SQL-fråga 2, vad går snabbast?
 
Vad går snabbast om man vill hämta ut slumpade rader från en mysql-databas, generera slumpade index innan man skickar queryn eller använda sig av RAND()?

alt 1:
Kod:

SELECT * FROM table WHERE id=12 OR id=9 OR id=1 OR id=35 OR id=41 LIMIT 0,5
alt 2:
Kod:

SELECT * FROM table ORDER BY RAND() LIMIT 0,5
Jag hade kunnat lagt tid på att försöka benchmarka detta men tänkte att någon kanske kunde svara på rak arm.

/ vic

captaindoe 2012-01-07 15:31

RAND() gick snabbare för mig i när jag körde dessa queries i min databas.

Citat:

Visar rader 0 - 4 ( 5 totalt, Frågan tog 0.0025 sek)
SELECT *
FROM tabell
ORDER BY RAND( )
LIMIT 0 , 5

Citat:

Visar rader 0 - 4 ( 5 totalt, Frågan tog 0.0122 sek)
SELECT *
FROM tabell
WHERE id =12
OR id =9
OR id =1
OR id =35
OR id =41
LIMIT 0 , 5

hnn 2012-01-07 22:03

Testa med:
Kod:

SELECT * FROM tabell WHERE id IN (12,9,1,35,41) LIMIT 0 , 5
Testa att strunta i * och använd id istället.

tartareandesire 2012-01-08 01:41

RAND() är rent generellt ganska långsamt och bör normalt sett undvikas om möjligt, särskilt när det gäller större tabeller.

Clarence 2012-01-08 14:05

Att slumpa IDs innan och använda dessa i din IN-clause är enormt mycket snabbare när din data växt till sig lite.

Testkörde på en tabell med bara ett par hundra tusen rader och skillnaden blev ca 200ggr snabbare.

Dock så ger dig inte den förslumpade lösningen garanterat träffar då man brukar ha borttagna rader i tabellerna vilket ger saknade ids.

znap 2012-01-08 16:03

Tack allesammans för svaren.

Jag kan tillägga att jag nu kör på en lösning i stil med följande:
Kod:

<?php
$start_id = mt_rand(0, $max_id_in_db-5);
$db->query('SELECT * FROM table WHERE id > '.$start_id.' LIMIT 0,5');

Blir inte lika bra "slumpning" av raderna men det räcker gott i mitt fall.


Alla tider är GMT +2. Klockan är nu 22:55.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson