我見過幾個數據庫緩存引擎,它們都非常笨(即:keep this query cached for X minutes
),並且需要在執行10/DELETE
查詢後手動刪除整個緩存存儲庫。智能(?)數據庫緩存
約2〜3年前,我開發了一個替代DB緩存系統的一個項目我工作,這個想法基本上是使用正則表達式來查找有關特定SQL查詢表(S):
$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',
);
我知道這些正則表達式可能有一些缺陷(當時我的正則表達式技能很綠),顯然不匹配嵌套查詢,但是因爲我從來沒有使用它們,這對我來說不是問題。
不管怎樣,找到相關表我會按字母順序進行排序,並與以下命名約定高速緩存儲存庫創建一個新的文件夾後:
+table_a+table_b+table_c+table_...+
在SELECT
查詢的情況下,我會獲取結果從數據庫中,serialize()
並將其存儲在適當的緩存文件夾,所以例如下面的查詢結果:
SELECT `table_a`.`title`, `table_b`.`description` FROM `table_a`, `table_b` WHERE `table_a`.`id` <= 10 ORDER BY `table_a`.`id` ASC;
將存儲在:
/cache/+table_a+table_b+/079138e64d88039ab9cb2eab3b6bdb7b.md5
MD5是查詢本身。在後續的SELECT查詢結果將是微不足道的提取。
在任何其他類型的寫入查詢(INSERT
,REPLACE
,UPDATE
,DELETE
等)的情況下我會3210都在他們的名字了+matched_table(s)+
的文件夾全部刪除所有文件內容。這樣就不需要刪除整個緩存,只需刪除受影響和相關表所使用的緩存。
該系統工作得很好,性能的差異是可見的 - 雖然該項目有更多的閱讀查詢比寫查詢。從那時起,我開始使用交易,FK CASCADE UPDATES
/DELETES
,並且從來沒有時間來完善系統以使其適用於這些功能。
我以前用MySQL Query Cache,但是我必須說性能甚至沒有比較。
我想知道:我是唯一一個在這個系統中看到美麗的人嗎?有沒有我可能沒有意識到的瓶頸?爲什麼流行的框架如CodeIgniter和Kohana(我不知道Zend Framework)有這樣基本的DB緩存系統?
更重要的是,你認爲這是一個值得追求的功能嗎?如果是,有什麼我可以做/使用到使它更快(我主要關注的是磁盤I/O和(德)序列化的查詢結果)?
我感謝所有的輸入,謝謝。
我會說增加更多的內存到你的SQL框,讓它擔心緩存本身。 – DmitryK 2010-01-07 12:56:18
@DmitryK:就像我之前說過的,我過去使用過MySQL查詢緩存,但是我的系統提供了更好的性能(不知道爲什麼)。 – 2010-01-07 13:21:22
+1用於詢問自己和自己的方法。這是一個非常重要的事情,國際海事組織! – nickf 2010-01-08 00:01:42