Gunakan cache kueri bawaan MySQL alih-alih mencoba mempertahankannya sendiri. Ini akan secara otomatis menghapus kueri yang di-cache ke tabel saat ditulis. Selain itu, ia bekerja di memori sehingga harus sangat efisien...
Juga, jangan hanya menyimpan kueri. Cobalah untuk men-cache seluruh segmen aplikasi pada tahapan yang berbeda dalam siklus rendering. Jadi Anda dapat membiarkan MySQL menyimpan kueri, lalu Anda menyimpan cache setiap tampilan individual (dirender), setiap blok individual, dan setiap halaman. Kemudian, Anda dapat memilih apakah akan menarik dari cache atau tidak berdasarkan permintaan.
Misalnya, pengguna yang tidak masuk dapat memperoleh halaman penuh langsung dari cache. Tetapi pengguna yang masuk mungkin tidak dapat (karena nama pengguna, dll). Jadi baginya, Anda mungkin dapat merender 1/2 tampilan Anda di halaman dari cache (karena tidak bergantung pada objek pengguna). Anda tetap mendapatkan manfaat dari caching, tetapi akan berjenjang berdasarkan kebutuhan.
Jika Anda benar-benar mengharapkan banyak lalu lintas, ada baiknya melihat Memcached
. Biarkan MySQL menyimpan kueri Anda untuk Anda, lalu simpan semua item cache pengguna di memcache...
Sunting: Untuk menjawab suntingan Anda:
Sistem file bisa menjadi lambat jika satu direktori tumbuh besar. Selama Anda "menempatkan nama" berdasarkan direktori (jadi setiap direktori hanya memiliki sebagian kecil file cache), Anda akan baik-baik saja dari sudut pandang itu. Adapun ambang batas yang tepat, itu benar-benar akan bergantung pada perangkat keras dan sistem file Anda lebih dari apa pun. Saya tahu EXT3 menjadi sangat lambat jika ada banyak file dalam satu direktori (saya memiliki direktori dengan ratusan ribu file, dan dapat memakan waktu hingga setengah detik untuk hanya stat()
salah satu file, apalagi melakukan segala jenis daftar direktori)...
Tetapi sadarilah bahwa jika Anda menambahkan server lain, Anda akan memiliki duplikasi cache (yang bukan merupakan hal yang baik), atau harus menulis ulang seluruh lapisan cache Anda. Apakah ada alasan untuk tidak menggunakan Memcached
dari awal?
EDIT 2 Untuk menjawab editan terakhir Anda:
Masih terlalu sulit untuk menelepon. Saya memiliki aplikasi yang memiliki database dengan sekitar 1,5 miliar baris (tumbuh sekitar 500rb per hari). Kami tidak menggunakan caching sama sekali karena kami tidak memiliki masalah konkurensi. Dan bahkan jika kita melakukannya, kita akan lebih baik melemparkan lebih banyak server MySQL daripada menambahkan caching karena segala bentuk cache akan memiliki hit rate yang rendah sehingga tidak sepadan dengan waktu pengembangan untuk menambahkannya.
Dan itulah alasan saya sangat bersikeras untuk tidak melakukan caching untuk kecepatan. Akan selalu ada objek yang tidak ada di cache. Jadi, jika Anda membuka halaman dengan salah satu objek itu, itu masih harus cepat. Sebagai aturan praktis, saya mencoba untuk men-cache apa pun yang akan diakses lagi dalam beberapa menit ke depan (saya tetap meluangkan waktu sekitar 5 menit untuk produksi di aplikasi lain). Jadi, jika item tidak mendapatkan lebih dari beberapa hit dalam rentang waktu tersebut, atau hit rate sangat rendah (kurang dari 90%), saya tidak perlu repot menyimpan item tersebut....