Ինչպես օպտիմալացնել ORDER BY RAND() օպերատորը։
sobes.tech AI
Պատասխան AI-ից
ORDER BY RAND() օպտիմալիզացնելը դժվար է, քանի որ այն պահանջում է տվյալների ամբողջական ընտրություն՝ յուրաքանչյուր տողի համար պատահական թիվ ստեղծելու համար: Տիպիկ մոտեցումները՝
-
Պատահական նույնականացուցիչ ընտրել:
- Ստանալ տողերի քանակը աղյուսակում:
- Ստեղծել պատահական թիվ 0-ից N-1 (կամ 1-ից N):
- Ընտրել համապատասխան տեղաշարժով կամ
OFFSET-ով տող:
SELECT COUNT(*) FROM your_table; -- Կարծում ենք, ընդհանուր_տողերի_համար = N SELECT * FROM your_table LIMIT 1 OFFSET floor(random() * N);Այս մեթոդը հարմար է մեկ կամ մի քանի պատահական տող ընտրելու համար: Չի արդյունավետ մեծ քանակությամբ տողերի համար:
-
Պատահական ընտրություն
idտիրույթում:- Գտնել նվազագույն և առավելագույն
id-ները: - Ստեղծել պատահական թիվ այդ տիրույթում:
- Ընտրել տող
id >= պատահական_թիվ-ով, օգտագործելովLIMIT:
SELECT MIN(id), MAX(id) FROM your_table; -- Կարծում ենք, որ ստացել ենք min_id, max_id -- Ծրագրում ստեղծում ենք պատահական `id` տիրույթում [min_id, max_id] -- Օրինակ՝ պատահական_id = min_id + floor(random() * (max_id - min_id + 1)) SELECT * FROM your_table WHERE id >= պատահական_id LIMIT 1;Դա կարող է բաց թողնել տողեր, եթե
id-ներում բացեր կան: - Գտնել նվազագույն և առավելագույն
-
Անցումային աղյուսակ կամ ենթաառաքում օգտագործել պատահական կարգավորմամբ:
- Ընտրել տվյալների ենթամասուխ կամ միայն
id-ներ ենթաառաքում: - Կիրառել
ORDER BY RAND()այդ ենթամասուքի վրա:
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY RAND() LIMIT 100) AS t2 ON t1.id = t2.id;Կրճատում է բեռը, եթե
LIMIT-ը կիրառվում է ենթաառաքում: - Ընտրել տվյալների ենթամասուխ կամ միայն
-
Ավելացնելիք դաշտով պատահական թվով:
- Ավելացնել աղյուսակին դաշտ՝ պատահական թվի համար:
- Պարբերաբար թարմացնել այդ դաշտը բոլոր տողերի համար:
- Սորտավորել այդ դաշտով:
-- Դաշտ ավելացնել ALTER TABLE your_table ADD random_sort_key FLOAT; -- Պարբերական թարմացում UPDATE your_table SET random_sort_key = RAND(); -- Ընտրել SELECT * FROM your_table ORDER BY random_sort_key LIMIT 10;Պահանջում է փոփոխություններ սքեմայում և ֆոնային թարմացման գործընթացում:
-
"Խառնելու" ալգորիթմ (Fisher-Yates)՝ տվյալների բազայից դուրս:
- Ընտրել բոլոր
id-ները (կամ բոլոր տվյալները, եթե փոքր են): - Խառնել ցանկը ծրագրում:
- Ընտրել առաջին N տարրերը:
// Կարծում ենք, որ ids - դա []int // ids = ... // Գումարել ids տվյալների բազայից rand.Shuffle(len(ids), func(i, j int) { ids[i], ids[j] = ids[j], ids[i] }) // Այժմ առաջին N տարրերը ids պատահական են // Օգտագործել նրանց ամբողջ տողերը ընտրելու համար // SELECT * FROM your_table WHERE id IN (...)Միայն փոքր քանակությամբ տողերով աղյուսակների համար:
- Ընտրել բոլոր
Ընտրել լավագույն մեթոդը՝ կախված աղյուսակի չափից, պահանջվող պատահական տողերի քանակից և կոնկրետ տվյալների բազայի կառավարման համակարգից: Բոլոր դեպքերում, երբ անհրաժեշտ է ընտրել փոքր քանակությամբ պատահական տողեր մեծ աղյուսակից, id ստանալը և հետագա OFFSET կամ WHERE id IN (...) համադրությունը ավելի արդյունավետ կլինի, քան մաքուր ORDER BY RAND():