Rumah  >  Artikel  >  pangkalan data  >  Mengapakah `ORDER BY RAND()` Mempunyai Prestasi Tidak Diramal sedemikian dalam MySQL?

Mengapakah `ORDER BY RAND()` Mempunyai Prestasi Tidak Diramal sedemikian dalam MySQL?

Susan Sarandon
Susan Sarandonasal
2024-11-04 03:58:30499semak imbas

Why Does `ORDER BY RAND()` Have Such Unpredictable Performance in MySQL?

Menyelidiki ORDER MySQL BY RAND() dan Kejutan Prestasinya

Pengenalan
ORDER BY RAND( ) ialah binaan yang biasa digunakan dalam MySQL untuk mendapatkan semula baris rawak daripada jadual. Walau bagaimanapun, di sebalik sintaks yang kelihatan mudah ini terdapat mekanisme kompleks yang boleh membawa kepada variasi prestasi yang tidak dijangka. Artikel ini menyelidiki cara dalaman ORDER BY RAND() dan cuba menerangkan beberapa gelagatnya yang membingungkan.

Hasil Tidak Dijangka dengan ORDER BY RAND()
Perbezaan prestasi bertentangan timbul apabila menggunakan ORDER BY RAND() pada lajur dengan jenis data yang berbeza. Pertanyaan berikut menunjukkan fenomena ini:

  • PILIH * DARI PESANAN jadual MENGIKUT RAND() HAD 1; /*30-40 saat*/
  • PILIH id DARI PESANAN jadual MENGIKUT RAND() HAD 1; /*0.25 saat*/
  • PILIH id, nama pengguna DARI jadual PESANAN MENGIKUT RAND() HAD 1; /*90 saat*/

Walaupun mengisih pada satu lajur dalam ketiga-tiga pertanyaan, masa pelaksanaan berbeza secara drastik. Ini menimbulkan persoalan tentang mekanisme asas dan pergantungannya pada ciri data.

Penyelesaian Jay: Pemilihan Rawak Pantas
Untuk menangani kebimbangan prestasi, Jay telah mencadangkan kaedah alternatif:

<code class="sql">SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;</code>

Pertanyaan ini dengan ketara mengatasi pendekatan ORDER BY RAND() tradisional, menyerlahkan cara yang lebih cekap untuk memilih data rawak. Walaupun kaedah ini menangani isu prestasi, kaedah ini memperkenalkan kerumitan dan mungkin tidak selalu dapat dilaksanakan dalam semua senario.

Memahami Variasi Prestasi
Masa pelaksanaan berbeza yang diperhatikan untuk ORDER BY RAND( ) pertanyaan boleh dijelaskan oleh keupayaan pengindeksan MySQL. Lajur diindeks, seperti id dalam kes ini, membenarkan akses yang lebih pantas kepada data, yang membawa kepada pelaksanaan yang lebih cepat. Apabila mendapatkan semula berbilang lajur, seperti dalam SELECT id, nama pengguna FROM table ORDER BY RAND() LIMIT 1;, MySQL perlu mendapatkan semula nilai untuk kedua-dua lajur, meningkatkan masa pelaksanaan.

Kesimpulan
Walaupun ORDER BY RAND() kekal sebagai alat yang berguna untuk mendapatkan semula baris rawak, adalah penting untuk memahami implikasi prestasinya. Dengan mempertimbangkan jenis data yang terlibat dan memanfaatkan kaedah alternatif apabila perlu, pembangun boleh mengoptimumkan pertanyaan mereka dan mencapai hasil yang lebih pantas.

Atas ialah kandungan terperinci Mengapakah `ORDER BY RAND()` Mempunyai Prestasi Tidak Diramal sedemikian dalam MySQL?. 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