解決資料庫高併發的一種方案 分庫分表

2021-09-11 18:21:39 字數 1484 閱讀 8205

例:qq的登入表。假設qq的使用者有100億,如果只有一張表,每個使用者登入的時候資料庫都要從這100億中查詢,會很慢很慢。如果將這一張表分成100份,每張表有1億條,就小了很多,比如qq0,qq1,qq1…qq99表。

使用者登入的時候,可以將使用者的id%100,那麼會得到0-99的數,查詢表的時候,將表名qq跟取模的數連線起來,就構建了表名。比如123456789使用者,取模的89,那麼就到qq89表查詢,查詢的時間將會大大縮短。

這就是水平分割。

垂直分割指的是:表的記錄並不多,但是欄位卻很長,表占用空間很大,檢索表的時候需要執行大量的io,嚴重降低了效能。這時需要把大的字段拆分到另乙個表,並且該錶與原表是一對一的關係。

例如學生答題表tt:有如下字段:

id name 分數 題目 回答

其中題目和回答是比較大的字段,id name 分數比較小。

如果我們只想查詢id為8的學生的分數:select 分數 from tt where id = 8;雖然知識查詢分數,但是題目和回答這兩個大字段也是要被掃瞄的,很消耗效能。但是我們只關心分數,並不想查詢題目和回答。這就可以使用垂直分割。我們可以把題目單獨放到一張表中,通過id與tt表建立一對一的關係,同樣將回答單獨放到一張表中。這樣我們插敘tt中的分數的時候就不會掃瞄題目和回答了。

1)存放、檔案等大檔案用檔案系統儲存。資料庫只儲存路徑,和檔案存放在檔案系統,甚至單獨存放在一台伺服器(圖床)。

2)資料引數配置。

最重要的引數就是記憶體,我們主要用的innodb引擎,所以下面兩個引數調的很大:

innodb_additional_mem_pool_size=64m

innodb_buffer_pool_size=1g

對於myisam,需要調整key_buffer_size,當然調整引數還是要看狀態,用show status語句可以看到當前狀態,以決定該調整哪些引數。

如果機器的記憶體超過4g,那麼應當採用64位作業系統和64位mysql。

案例:簡單購物系統暫設涉及如下表:

1.產品表(資料量10w,穩定)

2.訂單表(資料量200w,且有增長趨勢)

3.使用者表 (資料量100w,且有增長趨勢)

以mysql為例講述下水平拆分和垂直拆分,mysql能容忍的數量級在百萬靜態資料可以到千萬

垂直拆分:

解決問題:

表與表之間的io競爭

不解決問題:

單錶中資料量增長出現的壓力

方案:把產品表和使用者表放到乙個server上

訂單表單獨放到乙個server上

水平拆分:

解決問題:

單錶中資料量增長出現的壓力

不解決問題:

表與表之間的io爭奪

方案:使用者表通過性別拆分為男使用者表和女使用者表

訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單

產品表 未完成訂單放乙個server上

已完成訂單表盒男使用者表放乙個server上

女使用者表放乙個server上

**:

高併發解決方案 資料庫高併發解決方案部署優化

乙個專案剛開始的時候是為了實現基本功能,隨著版本和功能的迭代,大資料和高併發成了軟體設計必須考慮的問題 本質很簡單,乙個是慢,乙個是等。兩者是相互關聯的,因為慢,所以要等,因為等,所以慢,解決了慢,也就解決了等,解決了等,也就解決了慢。關鍵是如何解決慢和等?核心 乙個是短,乙個是少,乙個是分流,最後...

SQLite 資料庫加密的一種解決方案

sqlite3 db sqlite3 stmt stat char zerrmsg 0 char temp 256 fileroot 256 char buffer2 1024 0 sprintf temp,t s t utf.db ccodingconv gb2312 2 utf8 fileroo...

SQLite 資料庫加密的一種解決方案

sqlite 是乙個非常小巧的跨平台嵌入式資料庫,它的資料庫以檔案的形式存放在本地磁碟上,但是在其開源的免費版中它卻缺少了乙個資料庫中幾乎是必備的功能,那就是對於資料庫的加密。sqlite 的資料庫檔案可以被任何的文字編輯工具開啟,從而獲取到其中的資料,這一點令很多開發者感到不安。但是其實 sqli...