Bagaimana cara memperkirakan operasi I / O yang dilakukan oleh permintaan MySQL?

13

Di RDS Amazon, Anda membayar sekitar $ 0,10 per 1 juta permintaan I / O. Saya perhatikan sejumlah besar (dalam ratusan ribu) permintaan I / O untuk basis data lalu lintas yang sangat rendah. Melihat hal ini, saya melakukan riset lebih lanjut, dan menemukan pertanyaan yang menggambarkan bahwa untuk 6.000 situs web pengguna, ia menghasilkan 800 juta permintaan I / O sebulan, yang akan menelan biaya sekitar $ 80 / bulan.

Oleh karena itu, saya ingin tahu sebelumnya berapa banyak operasi I / O yang dihasilkan oleh permintaan MySQL, dan bagaimana cara mengoptimalkan / meminimalkannya. Apakah ada cara untuk memperkirakan berapa banyak operasi I / O yang akan dilakukan kueri, dan aturan umum yang dapat saya ikuti untuk menjaga agar serendah mungkin?

Klik Upvote
sumber

Jawaban:

2

Jawaban komunitas Wiki dihasilkan dari komentar pada pertanyaan oleh Raymond Nijland

Gunakan EXPLAIN. Dengan cara ini Anda dapat melihat apakah permintaan MUNGKIN membutuhkan IO disk. Anda harus menghindari di kolom tambahan "Menggunakan sementara" atau "" Menggunakan sementara; Menggunakan filesort (perhatikan filesort adalah nama yang menyesatkan: jika hasil yang diset sesuai dengan memori, quicksort dijalankan dalam memori) ".

Ini kemungkinan besar disebabkan oleh subqueries / serikat pekerja / order oleh / grup oleh / ... Jika hasil Anda besar dan tabel sementara berbasis disk MyISAM dibuat, dan Anda perlu mengurutkan hasilnya, Anda mengurutkan hasilnya diatur berdasarkan IO membaca dan IO menulis dengan algoritma quicksort.

Dalam Penggunaan Tabel Sementara Internal di MySQL Anda dapat membaca kapan MySQL perlu membuat tabel MyISAM berbasis disk. Mungkin Anda dapat menggunakan avg_row_length * rows (meskipun perhatikan bahwa nilai rows dari menjelaskan tidak tepat dengan mesin InnoDB) untuk memeriksa apakah hasilnya cocok dengan heap. Lihat SHOW TABLE STATUS Syntax .

Secara umum apakah InnoDB atau MyISAM lebih baik untuk menghindari permintaan I / O?

InnoDB akan buffer data tabel dan data indeks, sedangkan MyISAM hanya buffer kunci indeks. I / O untuk data tabel diperlukan ketika menjelaskan kolom tambahan tidak mengatakan "Menggunakan indeks".

Jika keduanya menggunakan indeks: Dengan InnoDB, jika buffer panas dapat memuat data dari memori. Jika indeks perlu berasal dari disk ada rumus yang dapat Anda gunakan untuk menghitung IO yang diperlukan dibaca untuk selektif, sisipan, dan pembaruan. Dari Memperkirakan Performa Permintaan :

Untuk tabel kecil, Anda biasanya dapat menemukan baris dalam satu pencarian disk (karena indeks mungkin di-cache). Untuk tabel yang lebih besar, Anda dapat memperkirakan bahwa, menggunakan indeks B-tree, Anda membutuhkan banyak upaya ini untuk menemukan baris:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

Indeks InnoDB lebih besar karena menyimpan data dari kunci PRIMARY / UNIK ke dalam indeks KUNCI. Ini lebih cepat dan membutuhkan lebih sedikit IO mencari tetapi Anda dapat mengompresi data atau indeks InnoDB.

Paul White
sumber