Sobes.tech
Middle+

Ինչպես օպտիմալացնել ORDER BY RAND() օպերատորը։

sobes.tech AI

Պատասխան AI-ից

ORDER BY RAND() օպտիմալիզացնելը դժվար է, քանի որ այն պահանջում է տվյալների ամբողջական ընտրություն՝ յուրաքանչյուր տողի համար պատահական թիվ ստեղծելու համար: Տիպիկ մոտեցումները՝

  1. Պատահական նույնականացուցիչ ընտրել:

    • Ստանալ տողերի քանակը աղյուսակում:
    • Ստեղծել պատահական թիվ 0-ից N-1 (կամ 1-ից N):
    • Ընտրել համապատասխան տեղաշարժով կամ OFFSET-ով տող:
    SELECT COUNT(*) FROM your_table;
    -- Կարծում ենք, ընդհանուր_տողերի_համար = N
    
    SELECT * FROM your_table LIMIT 1 OFFSET floor(random() * N);
    

    Այս մեթոդը հարմար է մեկ կամ մի քանի պատահական տող ընտրելու համար: Չի արդյունավետ մեծ քանակությամբ տողերի համար:

  2. Պատահական ընտրություն 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-ներում բացեր կան:

  3. Անցումային աղյուսակ կամ ենթաառաքում օգտագործել պատահական կարգավորմամբ:

    • Ընտրել տվյալների ենթամասուխ կամ միայն 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-ը կիրառվում է ենթաառաքում:

  4. Ավելացնելիք դաշտով պատահական թվով:

    • Ավելացնել աղյուսակին դաշտ՝ պատահական թվի համար:
    • Պարբերաբար թարմացնել այդ դաշտը բոլոր տողերի համար:
    • Սորտավորել այդ դաշտով:
    -- Դաշտ ավելացնել
    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;
    

    Պահանջում է փոփոխություններ սքեմայում և ֆոնային թարմացման գործընթացում:

  5. "Խառնելու" ալգորիթմ (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():