Ve elle bir INSERT
/ {[(2 sonra bütün önbellek depo silmek gerektirir: Ben hepsini çok aptal vardır (keep this query cached for X minutes
yani), birkaç veritabanı önbellek motorları gördüm )]} / DELETE
sorgu idam edilmiştir.
Yaklaşık 2 veya 3 yıl önce üzerinde çalıştığım bir proje için alternatif bir DB önbellek sistemi geliştirdi, fikir belirli bir SQL Sorguda tablo (ler) bulmak için normal ifadeler kullanmak temelde:
$query_patterns = array
(
'INSERT' => '/INTO\s+(\w+)\s+/i',
'SELECT' => '/FROM\s+((?:[\w]|,\s*)+)(?:\s+(?:[LEFT|RIGHT|OUTER|INNER|NATURAL|CROSS]\s*)*JOIN\s+((?:[\w]|,\s*)+)\s*)*/i',
'UPDATE' => '/UPDATE\s+(\w+)\s+SET/i',
'DELETE' => '/FROM\s+((?:[\w]|,\s*)+)/i',
'REPLACE' => '/INTO\s+(\w+)\s+/i',
'TRUNCATE' => '/TRUNCATE\s+(\w+)/i',
'LOAD' => '/INTO\s+TABLE\s+(\w+)/i',
);
Ben bu regexs muhtemelen bazı kusurları (benim regex becerileri sonra geri oldukça yeşil idi) var ve tabii ki iç içe geçmiş sorguları eşleşmiyor biliyorum, ama onları kullanmak asla beri bu benim için bir sorun değildir.
Neyse, ilgili tablolar bulduktan sonra ben bunları alfabetik olarak sıralamak istiyorum ve aşağıdaki adlandırma kuralı ile önbellek deposunda yeni bir klasör oluşturun:
+table_a+table_b+table_c+table_...+
Bir SELECT
sorgu durumda, ben, veritabanından sonuçlar almak istiyorum serialize()
onları ve uygun önbellek klasöründe saklayabilirsiniz böylece örneğin aşağıdaki sorgu sonuçları:
SELECT `table_a`.`title`, `table_b`.`description` FROM `table_a`, `table_b` WHERE `table_a`.`id` <= 10 ORDER BY `table_a`.`id` ASC;
Saklanır olacaktır:
/cache/+table_a+table_b+/079138e64d88039ab9cb2eab3b6bdb7b.md5
MD5 sorgu kendisidir. Müteakip bir SELECT sorgusu üzerine sonuç almak için önemsiz olacaktır.
Yazma sorgu başka tür durumunda (INSERT
, REPLACE
, UPDATE
, DELETE
ve benzeri) I olacaktır {[( kendi adına +matched_table(s)+
vardı 4)]} tüm klasörleri tüm dosya içeriğini silin. Bu şekilde, etkilenen ve ilgili tablolar tarafından kullanılan, sadece önbellek tüm önbelleğini silmek için gerekli olmaz.
Sistem oldukça iyi çalıştı ve performans farkı görünür oldu - Proje sorguları yazmak çok daha fazla okuma sorguları vardı rağmen. O zamandan beri ben işlemleri, FK CASCADE UPDATES
/ DELETES
kullanmaya başladı ve bu özellikleri ile çalışması için sistem mükemmel zaman yoktu.
Ben geçmişte MySQL Query Cache kullandım ama ben bile performansı karşılaştırmak değil söylemeliyim.
Ben merak ediyorum: Ben bu sistemde güzelliği görür tek ben miyim? Ben farkında olmayabilir herhangi darboğazları var mı? Neden CodeIgniter ve Kohana (I Zend Framework farkında değilim) gibi popüler çerçeveler gibi ilkel DB önbellek sistemleri var mı?
Daha da önemlisi, takip değer bir özellik olarak bunu görüyor musun? Evet, ben / make it even faster (benim ana kaygıları disk I/O and (de)serialization sorgu sonuçlarının vardır) için kullanabilirsiniz yapabileceği bir şey var mı?
Ben, teşekkürler katkılarınıza teşekkür ederiz.