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

Bagaimana saya bisa mengoptimalkan fungsi ORDER BY RAND () MySQL?

Coba ini:

SELECT  *
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random r
        WHERE   (@cnt := @cnt - 1)
                AND RAND(20090301) < @lim / @cnt
        ) i

Ini sangat efisien di MyISAM (karena COUNT(*) instan), tetapi bahkan dalam InnoDB itu 10 kali lebih efisien daripada ORDER BY RAND() .

Ide utamanya di sini adalah bahwa kita tidak mengurutkan, tetapi menyimpan dua variabel dan menghitung running probability dari baris yang akan dipilih pada langkah saat ini.

Lihat artikel ini di blog saya untuk detail lebih lanjut:

Pembaruan:

Jika Anda perlu memilih satu rekaman acak, coba ini:

SELECT  aco.*
FROM    (
        SELECT  minid + FLOOR((maxid - minid) * RAND()) AS randid
        FROM    (
                SELECT  MAX(ac_id) AS maxid, MIN(ac_id) AS minid
                FROM    accomodation
                ) q
        ) q2
JOIN    accomodation aco
ON      aco.ac_id =
        COALESCE
        (
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_id > randid
                AND ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        ),
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        )
        )

Ini mengasumsikan ac_id . Anda 's didistribusikan kurang lebih merata.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mencari data JSON di MySQL?

  2. Panduan Merancang Database Untuk Polling &Survey Di MySQL

  3. Pemecahan Masalah Campuran ilegal kesalahan susunan di mysql

  4. Buang database mysql ke cadangan plaintext (CSV) dari baris perintah

  5. Tidak dapat menghapus atau memperbarui baris induk:batasan kunci asing gagal