dokumentasi
resmi MySQL 5.1 mengakui bahwa InnoDB tidak memberikan statistik yang akurat dengan SHOW TABLE STATUS
. Sedangkan tabel MYISAM secara khusus menyimpan cache internal meta-data seperti jumlah baris dll, mesin InnoDB menyimpan data tabel dan indeks di */var/lib/mysql/ibdata**
InnoDB tidak memiliki file indeks yang memungkinkan kueri cepat nomor baris.
Nomor baris tabel yang tidak konsisten dilaporkan oleh SHOW TABLE STATUS
karena InnoDB secara dinamis memperkirakan nilai 'Baris' dengan mengambil sampel rentang data tabel (dalam */var/lib/mysql/ibdata**) dan kemudian mengekstrapolasi perkiraan jumlah baris. Sedemikian rupa sehingga dokumentasi InnoDB mengakui ketidakakuratan nomor baris hingga 50% saat menggunakan SHOW TABLE STATUS
Dokumentasi MySQL menyarankan penggunaan cache kueri MySQL untuk mendapatkan kueri nomor baris yang konsisten, tetapi dokumen tidak menentukan bagaimana . Penjelasan singkat tentang bagaimana hal ini dapat dilakukan berikut ini.
Pertama, periksa apakah cache kueri diaktifkan:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Jika nilai have_query_cache adalah TIDAK kemudian aktifkan cache kueri dengan menambahkan baris berikut ke /etc/my.cnf lalu restart mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(untuk informasi lebih lanjut lihat http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Query isi cache dengan
mysql> SHOW STATUS LIKE 'Qcache%';
Sekarang gunakan SQL_CALC_FOUND_ROWS
pernyataan dalam SELECT
permintaan:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
akan mencoba membaca dari cache dan, jika kueri ini tidak ditemukan, jalankan kueri terhadap tabel yang ditentukan dan kemudian komit jumlah baris tabel ke cache kueri. Eksekusi tambahan dari kueri di atas (atau SELECT
'yang dapat disimpan dalam cache' lainnya pernyataan - lihat di bawah) akan memeriksa cache dan mengembalikan hasil yang benar.
'cachable' SELECT
pertanyaan
- meskipun mereka LIMIT
hasilnya - akan berkonsultasi dengan cache kueri dan memungkinkan Anda untuk mendapatkan (hanya sekali) nomor baris tabel total dengan
SELECT FOUND_ROWS();
yang mengembalikan total baris tabel yang benar dari kueri cache sebelumnya.