Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa SHOW TABLE STATUS innodb sangat tidak dapat diandalkan?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql bergabung sebagai diagram venn

  2. Konfigurasi indeks MySQL

  3. bidang int pembaruan pembaruan mysql yaitu nol

  4. MySQL dan PHP:UTF-8 dengan karakter Cyrillic

  5. MySQLNonTransientConnectionException:Tidak dapat membuat koneksi ke server database