Kom ihåg mig?
Home Menu

Menu


SQL-fråga 2, vad går snabbast?

Ämnesverktyg Visningsalternativ
Oläst 2012-01-07, 15:04 #1
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
Standard 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
znap är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-01-07, 15:31 #2
captaindoes avatar
captaindoe captaindoe är inte uppkopplad
Flitig postare
 
Reg.datum: Dec 2010
Inlägg: 431
captaindoe captaindoe är inte uppkopplad
Flitig postare
captaindoes avatar
 
Reg.datum: Dec 2010
Inlägg: 431
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
captaindoe är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-01-07, 22:03 #3
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
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.
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-01-08, 01:41 #4
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
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.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-01-08, 14:05 #5
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
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.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-01-08, 16:03 #6
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
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.
znap är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:31.

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