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:
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!