2012-04-07 73 views
1

我正在基於pdo的數據庫類,使用的數據庫是一個mysql數據庫,但我想緩存數據庫以獲得更多的性能。將數據庫緩存在SQlite內存數據庫中並對其執行SELECT操作(並在INSERT,UPDATE,... db上更新數據庫)是否是個好主意? 但是,當我寫「cache = new PDO('sqlite:memory');」它會創建一個新的還是使用現有的數據庫?另外,如果一臺服務器託管多個網站,那麼如何使用不同的內存數據庫呢?PHP:數據庫緩存(與SQLite內存中)

+1

你知道mysql有內存引擎,對吧? – 2012-04-07 14:19:29

+1

但SQlite是本地的,mysql可能是遠程的( - >慢) – joschua011 2012-04-07 14:23:21

回答

2

每個SQLite內存數據庫都是連接特定的。即使在同一進程中打開兩個連接到:內存:,也會創建兩個單獨的內存數據庫。所以答案是總是會創建一個新的數據庫,並且它永遠不會使用現有的數據庫。

請謹慎使用正確的名稱來創建內存數據庫。任何其他名稱比:內存:(如:memorry:內存/:內存:)並不實際創建內存數據庫,但一個普通的文件基礎數據庫。這種情況默默地發生。

用建議的緩存獲得的性能增益可能很小。如果你在MySQL上選擇並且計算機有足夠的內存,由於操作系統磁盤緩衝,數據可能已經存在於RAM中。因此,以SQLite內存數據庫的形式添加另一層內存將無濟於事。

如果系統不是隻讀的,則建議的緩存容易導致複雜或不正確的緩存邏輯。如果某個進程執行了數據更新,則必須更新其緩存,更新MySQL數據庫,並且還必須創建一些機制,以告知其他進程它們的緩存不再有效,並且它們必須從MySQL讀取數據。否則你的數據很快就會變得混亂。並且想想當兩個進程決定同時更新相同數據但發生不同值時會發生什麼?你有衝突。

爲了獲得更多性能,我首先調整服務器和MySQL。如果它不夠,我會添加一個像Memcached這樣的緩存,它不是應用程序特定的,而是一個單獨的進程。即使這樣,您也必須小心構建應用程序邏輯,以便數據在更新上保持一致。如果你只使用MySQL並且使用InnoDB進行正確的事務處理,那麼MySQL就是爲你做的。