FAQ |
Kalender |
![]() |
#11 | ||
|
|||
Mycket flitig postare
|
Citat:
SELECT * FROM tp_question INNER JOIN tp_exam_tp_question ON tp_question.Id=tp_exam_tp_question.tp_questionsId WHERE tp_examId = 445 ORDER BY RAND() LIMIT 50 |
||
![]() |
![]() |
![]() |
#12 | ||
|
|||
Flitig postare
|
Citat:
Vi kan verifiera min teori genom att du postar resultatet från följande query. Kod:
SELECT tp_question.Id FROM tp_question INNER JOIN tp_exam_tp_question ON tp_question.Id=tp_exam_tp_question.tp_questionsId WHERE tp_examId = 445 ORDER BY tp_question.Id ASC LIMIT 50 Notera att en GROUP BY inte är lösning på din problem. |
||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Medlem
|
Citat:
Kod:
<?php $data = mysql_fetch_object("SELECT * FROM dbo.quiz WHERE category = 445"); shuffle($data); $results = array_slice($data, 0, 20); |
||
![]() |
![]() |
![]() |
#14 | ||
|
|||
Flitig postare
|
Din lösning är per definition ännu slöare. RAND() räkna alla element innan några väljs ut vilket tar O(n) tid. Din lösning kräver också O(n) läsningar + tiden det tar att hämta och skicka informationen mellan server och klient + bearbetning av datan.
|
||
![]() |
![]() |
![]() |
#15 | |||
|
||||
Bara ett inlägg till!
|
Citat:
Min arkitekturella utgångspunkt är att databasen skall göra så lite som möjligt - bättre att den gör det den är bra på och så låter man applikationslagret sköta resten. Enligt mig är OPs fall ett gränsfall, kanske är MySQL:s RAND-funktion bra nog för just detta fallet men i det stora hela är RAND inte designad för att skapa slumpmässiga tal av hög kvalité: "RAND() is not meant to be a perfect random generator. It is a fast way to generate random numbers on demand that is portable between platforms for the same MySQL version." |
|||
![]() |
![]() |
![]() |
#16 | ||
|
|||
Administratör
|
För att illustrera lite hur pass dåliga de dåliga lösningarna faktiskt är. Kört med 7 miljoner ca 100-150 byte rader i en InnoDB tabell på en medelmåttig hårdvara, med en kraftig maskin kan man förvänta sig 20-50% av exekveringstiden:
Exekveringstid ca 15s. Kod:
SELECT * FROM table ORDER BY RAND() LIMIT 1 Kod:
SELECT count(*) FROM table Kod:
SELECT * FROM table WHERE id >= FLOOR(1 + RAND() * (SELECT MAX(id) FROM table)) LIMIT 1
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#17 | ||
|
|||
Medlem
|
Körs totalt på 0.01s, 1000 rader motsvarande quizfrågor. Undviker att använda RAND(), som i sig är slö och som TS hade problem med.
|
||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Medlem
|
Värt å tillägga är att din lösning inte löser problemet då de verkar som att TS query returnerar dubletter. De är således inget fel på RAND() utan queryn i sig.
|
||
![]() |
![]() |
Svara |
|
|