基於PHP的MySQL分庫程式思想

2021-09-01 11:05:40 字數 1445 閱讀 4757

以前做php應用,多數是單資料庫資料查詢和更新,頂多也是主從資料庫的支援,實現起來相對簡單。主從資料庫的問題在於,當會話儲存在資料庫的時候,同步 將可能出現問題,也就是說有可能出現會話的中斷。所以我想在主從資料庫設計上,應該將所有會話相關表進行特殊對待。即:所有的會話資料表都可以更新和查 詢,當乙個使用者訪問站點的時候,即將此使用者繫結到指定資料庫,所有會話訪問和查詢操作都對此資料庫進行。會話表不做同步,其他非會話類更新也從主資料庫更 新。這樣做其實也逃脫不了會話更新時候的資料庫切換,所以如果不想麻煩,還是將會話存放在文字中進行的好。 

分資料庫設計,將可能從壓力效能上會提公升幾個檔次,當然單次執行效率不會比單資料庫來的高的,畢竟存在著資料庫切換的效率問題。分庫以及主從資料庫搭 配是可以比較好改善資料庫併發瓶頸的方案。原則:大資料量,分庫;大訪問量,主從。很多時候,都是這兩者並行(本文不討論cache)。 

我想,如果要實現分庫以及主從關係,那麼資料庫伺服器數量將是非常可觀,在應用程式中隨時切換到某一台伺服器,將是非常頭痛的問題,配置更換,變數名稱,是不是會有一大堆呢?如何尋找更好的解決方案將是本文談論的話題。 

首先是分庫使得資料庫頗多的問題。什麼情況下分庫?或許有些人還搞不明白為什麼要分庫,我就簡要說一下自己的經驗猜測。比如乙個部落格程式,一般設計是 將日誌存放在一張日誌表中。假設是乙個多使用者部落格,那麼將會關聯乙個uid,如果資料量不大,這樣設計是沒有問題的,但是當日誌量巨大,一天有幾十萬條日 志記錄錄入的時候,而且訪問量也比較可觀的時候,我想不可能每個使用者來訪問日誌列表,都去從這包含幾千萬條日誌記錄的資料表中去找那麼幾條,效率可見一 斑。這個時候就該考慮到分庫的問題。如何分?有乙個很簡單的分表方法,即,根據uid段,將日誌記錄在各個資料庫中,當然,這個分布還是需要根據以往統計 結果做出調整的,因為使用者日誌分布肯定不是均勻的。設定好uid段,然後根據uid索引到指定資料庫配置,建立乙個資料庫物件即可。配置資訊可能如下: 

copy code

$configs['db_info']['blog'][0] = array( 

『db_host』 => 』192.168.0.1′, 

『db_name』 => 『blog』, 

『db_user』 => 『root』, 

『db_pass』 => 」, 

); $configs['db_info']['blog'][1] = array( 

『db_host』 => 』192.168.0.2′, 

『db_name』 => 『blog』, 

『db_user』 => 『root』, 

『db_pass』 => 」, 

); $configs['db_info']['blog'][2] = array( 

『db_host』 => 』192.168.0.2′, 

『db_name』 => 『blog』, 

『db_user』 => 『root』, 

『db_pass』 => 」, 

); //…and so on

基於MySQL分庫分表方案簡介

1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...

基於MySQL分庫分表方案簡介

1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...

基於PHP的日曆程式

php日曆 函式獲取當前的年月 year get y get y date y mon get m get m date m 函式的使用,獲取當前月的天數及當月1號的星期 day date t mktime 0,0,0,mon,1,year w date w mktime 0,0,0,mon,1,y...