Dalam status MYSQL, nilai Handler_read_rnd_next sangat tinggi.
Saya menyadari bahwa, nilai ini akan bertambah ketika kueri dijalankan yang tidak memiliki indeks yang tepat.
Tetapi, bahkan ketika kita menjalankan status acara seperti 'Handler_read_rnd_next', nilai ini semakin bertambah 2.
Berdasarkan tanda status ini, kami memantau beberapa statistik.
Jadi setiap kali, statistik ini menunjukkan kritis.
Bisakah kita mengecualikan jumlah eksekusi 'tayang' ini dari hitungan 'Handler_read_rnd_next'.
Satu lagi contoh untuk ini,
Ada tabel dengan 10 baris, tabel diindeks pada kolom 'data', dan jika kita menjalankan kueri berikut:
select data from test where data = 'vwx' -> returns one row
dan jika kita memeriksa nilai 'Handler_read_rnd_next', itu bertambah 7.
Berikut ini adalah hasil dari menjelaskan perintah untuk permintaan di atas:
explain select data from test where data = 'vwx';
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'
Apakah ada cara untuk membatasi nilai ini, atau dapatkah saya tahu mengapa nilai ini bertambah sangat cepat.
sumber
Jawaban:
Pertama-tama, mari kita lihat definisi Handler_read_rnd_next.
Menurut Dokumentasi MySQL di Handler_read_rnd_next:
Sekarang, lihat permintaan Anda:
Anda mengatakan bahwa tabel memiliki 10 baris. Sebagai aturan praktis, Pengoptimal Permintaan MySQL akan mengabaikan penggunaan indeks jika jumlah baris yang perlu diperiksa lebih besar dari 5% dari total jumlah baris.
Mari kita berhitung. 5% dari 10 baris adalah 0,5 baris. Bahkan jika jumlah baris yang dibutuhkan untuk menemukan data Anda adalah 1, itu lebih besar dari 0,5. Berdasarkan jumlah baris yang lebih rendah dan aturan indeks yang baru saja saya sebutkan, Pengoptimal Permintaan MySQL akan selalu melakukan pemindaian tabel.
Karena kolom
data
itu sendiri diindeks, bukannya pemindaian tabel, mysql dilakukan pemindaian indeks.Jika Anda mengetahui dengan pasti bahwa tabel uji tidak akan pernah tumbuh, Anda dapat menghapus semua indeks dan membiarkan pemindaian tabel terjadi. Variabel status penangan harus berhenti bertambah.
sumber
Apa versi MySQL?
Alasan mengapa tanda ini bertambah adalah paling baik didokumentasikan di sini: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/
Singkatnya, ini hanyalah penghitung jumlah baris yang diambil secara berurutan selama pemindaian tabel penuh atau sebagian.
Sekarang, yang mengatakan, saya mendapatkan hasil yang berbeda:
sumber
Jika ada indeks unik / utama pada kolom "data" maka Anda sudah melakukan optimasi untuk permintaan ini. Saya tidak dapat berpikir optimasi lebih lanjut dapat dilakukan untuk ini.
Anda juga dapat memverifikasi apakah ada FULL TABLE SCAN telah dilakukan atau belum?
Pastikan select_scan tidak meningkatkan nilainya, dengan cara ini Anda dapat memeriksa apakah FULL TABLE SCAN selesai atau tidak, Anda harus mencoba mengoptimalkan kueri yang tidak akan melakukan FULL TABLE SCAN.
sumber