Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Alternatif untuk ORDER BY RAND()

PERBARUI 2016

Solusi ini bekerja paling baik menggunakan kolom terindeks .

Berikut adalah contoh sederhana dan bangku kueri yang dioptimalkan yang ditandai dengan 100.000 baris.

DIOPTIMALKAN:300 md

SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

catatan tentang jumlah batas :batas 4 dan 4/hitungan(*). 4s harus nomor yang sama. Mengubah berapa banyak Anda kembali tidak terlalu mempengaruhi kecepatan. Benchmark pada limit 4 dan limit 1000 adalah sama. Batas 10.000 membawanya hingga 600 md

catatan tentang bergabung :Mengacak hanya id lebih cepat daripada mengacak seluruh baris. Karena harus menyalin seluruh baris ke dalam memori kemudian mengacaknya. Gabung dapat berupa tabel apa pun yang ditautkan ke subquery Its untuk mencegah tabel.

perhatikan di mana klausa :Hitungan mana membatasi jumlah hasil yang diacak. Dibutuhkan persentase dari hasil dan mengurutkannya daripada seluruh tabel.

sub kueri catatan :Jika melakukan bergabung dan ekstra di mana kondisi klausa Anda harus menempatkan keduanya di subquery dan subsubquery. Untuk mendapatkan penghitungan yang akurat dan menarik kembali data yang benar.

TIDAK DIOPTIMALKAN:1200 md

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

PRO

4x lebih cepat dari order by rand() . Solusi ini dapat bekerja dengan tabel apa pun dengan kolom terindeks.

KONTRA

Ini agak rumit dengan pertanyaan yang kompleks. Perlu memelihara 2 basis kode di subkueri



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus Duplikat di tabel MySQL

  2. php/mysql dengan banyak kueri

  3. Izinkan semua koneksi jarak jauh, MySQL

  4. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/mysql/mysql.sock' (38)

  5. Cara Membuat Peringkat Di Atas Partisi di MySQL