Profil MySQL pada permintaan "Membuat Indeks Urut" menggunakan 75% dari total waktu

11

Kami mencoba mencari cara mengoptimalkan kueri (sekitar 100 ms) , dan menjalankan profil yang kami lihat Creating Sort Indexmenggunakan 75%waktu total. Pertama, apa sebenarnya efek membuat indeks pengurutan? Apakah itu disk / io?

Kedua, adakah optimasi yang bisa kita lakukan untuk query itu sendiri?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Menjelaskan: Tangkapan layar

Justin
sumber

Jawaban:

6

Kami memiliki masalah serupa untuk pertanyaan besar. Seringkali kueri berjalan selama berjam-jam (hingga 7-8) tergantung pada beban pada DB untuk 400M baris. Namun, tujuan kami adalah untuk mencapai hasil grup, seperti pilih col1, col2, col3, count (1), count (col4 berbeda) dari grup tabel dengan 1,2,3.

Masalah yang mendasari sama dengan Anda meskipun, seperti dalam kedua kasus DB macam (pesanan) hasilnya secara internal.

  • Cara membuat pengurutan indeks berfungsi. Di situs web mysql dikatakan "Utas sedang memproses SELECT yang diselesaikan menggunakan tabel sementara internal." Menurut pemahaman algoritme saya, sistem kemungkinan besar membagi data menjadi potongan-potongan, membaca dari disk potongan-potongan ini satu per satu, menyortir potongan-potongan individual, memasukkan kembali ke beberapa ruang disk sementara dan sebagainya. Sistem melakukan ini untuk semua chunks dan akhirnya melakukan semacam penggabungan. Ini melibatkan baca / tulis yang luas.

Solusi yang mungkin adalah meningkatkan memori Anda untuk DB (sehingga dapat membuat potongan yang lebih besar yang dapat tinggal di memori) atau jika Anda memiliki memori yang lebih besar di tempat lain, Anda dapat memprogram solusi dengan streaming dari DB. Ini dapat dicapai dalam waktu nlogn.

Secara pemrograman, saya dapat mengurangi waktu dari rata-rata 2 jam menjadi 7,5 menit yang konsisten.

Chandni
sumber
4

'Membuat indeks pengurutan' adalah database yang mencari tahu urutan nilai yang dikembalikan berdasarkan klausa 'pesanan oleh' Anda. Pembatas utama di sini adalah kecepatan CPU / CPU yang tersedia, dan bandwidth memori. Pengurutan tidak akan dilakukan sampai data sudah semua dalam memori, setidaknya untuk permintaan sekecil ini. Jika Anda membuat profil kueri, apakah Anda melihat menunggu sumber daya apa pun?

Sedangkan untuk membuat kueri ini lebih cepat, Anda dapat mempertimbangkan untuk menambahkan indeks pada 'r.added', karena tidak terlihat seperti ada satu menurut penjelasan Anda.

Unicorno Marley
sumber
Resep addedmemang memiliki indeks standar.
Justin