Kueri ini: select count(*) from planner_event
membutuhkan waktu yang sangat lama untuk dijalankan - begitu lama, saya menyerah dan membunuhnya sebelum selesai. Namun, ketika saya menjalankan explain select count(*) from planner_event
, saya bisa melihat kolom di output dengan jumlah baris (14m).
Bagaimana menjelaskan bisa mendapatkan jumlah baris secara instan, tetapi menghitung (*) membutuhkan waktu lama untuk dijalankan?
Jawaban:
Jelaskan menggunakan statistik yang dikumpulkan sebelumnya (digunakan oleh pengoptimal kueri). Melakukan
select count(*)
pembacaan SETIAP blok data.Berikut cara murah untuk mendapatkan taksiran jumlah baris:
select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='planner_event';
Bahkan jika Anda melakukannya
select count(id)
, mungkin masih membutuhkan waktu yang sangat lama, kecuali Anda memiliki indeks sekunder aktifid
(juga dengan asumsiid
adalah KUNCI UTAMA). Karena semua data (termasuk Data Baris) disimpan dalam indeks B-Tree, melakukan aselect count(PK_COLUMN)
masih banyak IO (perlu membaca semua halaman data). Jika Anda memiliki indeks sekunder di bidang PK, itu akan dapat melakukan lebih sedikit IO untuk melakukan penghitungan.sumber
EXPLAIN
memberi Anda.AND TABLE_SCHEMA='my_database'
, jika tidak Anda akan mendapatkan beberapa hasil kembali jika Anda memiliki tabel dengan nama yang sama di database lain.Jelaskan mendapat nomor dari beberapa "statistik" yang digunakan untuk memperkirakan hal-hal untuk Pengoptimal. Angka itu bisa jauh dari benar - saya kadang-kadang melihatnya lebih dari faktor 2 (lebih tinggi atau lebih rendah) daripada nilai yang tepat.
Melakukan
COUNT(*)
pada tabel InnoDB harus memindai tabel untuk menghindari salah perhitungan catatan yang sibuk dimasukkan / dihapus oleh koneksi lain tetapi belum "dilakukan". Sebenarnya, cukup baik untuk melakukan pemindaian penuh pada beberapa indeks, belum tentu seluruh tabel (yang berisiPRIMARY KEY
).Berapa banyak RAM yang Anda miliki? Apa nilainya
innodb_buffer_pool_size
? Mungkin membantu jika itu sekitar 70% dari RAM.sumber