Rumah  >  Artikel  >  pangkalan data  >  Bagaimanakah ORDER BY RAND() Berfungsi dalam MySQL, dan Mengapa Ia Sangat Lambat?

Bagaimanakah ORDER BY RAND() Berfungsi dalam MySQL, dan Mengapa Ia Sangat Lambat?

Barbara Streisand
Barbara Streisandasal
2024-11-04 06:07:01525semak imbas

How Does ORDER BY RAND() Work in MySQL, and Why Is It So Slow?

Memahami ORDER BY RAND() dalam MySQL

Walaupun sintaks ORDER BY RAND() nampak mudah, kerja dalamannya boleh menjadi misteri. Artikel ini menyelidiki mekanik di sebalik operasi ini dan menangani beberapa percanggahan prestasi yang tidak dijangka.

Bagaimana ORDER BY RAND() Berfungsi

Pada mulanya, dipercayai bahawa ORDER BY RAND () menambah lajur nilai rawak pada jadual dan diisih berdasarkan itu. Walau bagaimanapun, penyelidikan seterusnya mendedahkan bahawa kaedah yang dicadangkan Jay adalah jauh lebih pantas:

SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;

Kaedah ini menghasilkan ID rawak dalam julat ID sedia ada dan mendapatkan semula baris padanan pertama.

Variasi Prestasi

Menariknya, prestasi ORDER BY RAND() berbeza-beza berdasarkan lajur yang disertakan dalam hasil:

SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/
SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/
SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/

Percanggahan ini boleh dikaitkan dengan pengindeksan. Lajur id diindeks, menjadikan ia cepat diperolehi. Menambah nama pengguna pada hasil carian memerlukan membacanya dari setiap baris, memperlahankan operasi. Dalam kes *, semua lajur, termasuk yang boleh ubah panjang, perlu dimuatkan ke dalam memori, seterusnya memberi kesan kepada prestasi.

Alternatif untuk Pemilihan Rawak Pantas

Untuk pemilihan baris rawak yang cekap, pertimbangkan alternatif berikut:

  • Prosedur yang diterangkan dalam arkib blogger Jerman (web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql- order-by-rand-a-case-study-of-alternatives/).
  • Gunakan kaedah Jay, walaupun kerumitannya meningkat, untuk kelajuan optimum.
  • Gunakan pendekatan dua pertanyaan berikut untuk kesederhanaan:
SELECT id FROM table ORDER BY RAND() LIMIT 1;
SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;

Atas ialah kandungan terperinci Bagaimanakah ORDER BY RAND() Berfungsi dalam MySQL, dan Mengapa Ia Sangat Lambat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn