Saya menghubungkan database MySQL dengan PHP Data Objects (PDO) dan mengeksekusi query SQL yang luas. Biasanya, dibutuhkan sekitar 1500 ms; Saya masih perlu mengoptimalkannya. Ketika saya menjalankan skrip PHP dua kali dengan interval pendek di antaranya, kueri hanya membutuhkan waktu sekitar 90 ms. Kueri dalam kedua kasus sama. Ketika saya menjalankan skrip, dengan permintaan yang sama, setelah beberapa waktu lagi, dibutuhkan 1500 ms lagi.
Mengapa demikian? Apakah basis data cache secara otomatis? Apakah ada waktu database menyimpan cache dan kemudian secara otomatis menghapusnya?
Saya berasumsi hasilnya tidak dapat di-cache oleh PHP, karena ini terjadi dalam dua utas yang berbeda. Saya tidak akan berpikir PHP akan men-cache hasil, karena tidak dapat mengetahui apakah database telah berubah.
Saya memiliki skrip yang berjalan setiap menit untuk menyisipkan baris baru ke database. Ini mungkin juga menjadi alasan bahwa dibutuhkan 1500 ms lagi setelah beberapa waktu; cache sudah dihapus, karena tabel yang relevan tidak sama lagi.
Jawaban:
Ini kemungkinan merupakan artefak dari Cache MySQL Query .
Anda menjalankan query SQL, cache hasil dan eksekusi berikutnya jika cepat. Saat Anda menjalankan skrip untuk memasukkan data dalam tabel yang dirujuk oleh kueri Anda, cache hasil menjadi tidak valid dan kueri harus dieksekusi "nyata" di waktu berikutnya.
Dari dokumentasi MySQL yang ditautkan di atas:
sumber
Ya, mySQL (yang sama dengan semua produk basis data populer lainnya) membuat cache kueri yang dibuat untuk itu.
Caching ini cukup pintar - sering dapat menggunakan cache untuk kueri bahkan jika parameter persis kueri tidak sama. Ini dapat membuat perbedaan besar untuk kinerja.
Caching dikendalikan sepenuhnya di dalam perangkat lunak server DB; Anda tidak memiliki visibilitas apa pun dari cache berisi, atau berapa lama item yang diberikan tetap dalam cache; itu bisa ditimpa pada saat tertentu tergantung pada pertanyaan apa yang dipanggil, dll. Itu ada untuk membantu kinerja, tetapi tidak boleh diandalkan untuk kinerja.
Anda dapat membaca lebih lanjut tentang ini di sini di manual MySQL .
Selain itu, menggunakan PDO memungkinkan Anda untuk menulis kueri Anda sebagai "Pernyataan yang disiapkan", mengikat parameter daripada mengkodekannya menjadi string kueri teks biasa. Ini juga memiliki implikasi caching pada server DB dan untuk permintaan yang diulang, juga akan meningkatkan kinerja.
sumber
SELECT *
danselect *
berarti permintaan yang identik tidak akan dilayani dari cache. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Diposting tautan 5.1 untuk konsistensi, tetapi berlaku untuk semua versi.