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() тоза хоҳад буд.