之前寫過一篇文章《資料庫的使用你可能忽略了這些》,主要是從一些大家使用使用時容易忽略的地方,如:字段長度、表設計等來說明,這篇文章同樣也是這樣的主題,只是從另外的幾個方面來說說資料庫使用中,容易忽略,導致入坑的地方。
在資料庫進行表設計的時候,就應該評估可能產生的資料量,資料量會對整個開發和**的健壯性有很大的影響。開發乙個資料量萬級別、十萬級別、百萬級別、千萬以上級別數量的應用,在開發思路、技術選型、架構都能都要很大的差別。
基本上的我的原則是:
很多系統因為在設計表的時候,沒有很好的預估的後期系統的發展,導致上線不久就出現無法支撐的情況,**上太多的聯表查詢,不在乎基礎的sql效能,導致資料庫的瓶頸很快就顯現出來,不得不重構系統。設計資料庫的時候,一定是基於業務進行設計的,對業務的發展有一定的預估,看得長遠一點。
資料庫有天然的瓶頸,就是併發量。我們一般會通過快取來減少資料庫的併發連線,以及對資料庫的操作,資料庫的併發,不是只有大型平台才會遇到,很多中小平台其實也會面臨這樣的問題,例如:
迴圈進行資料庫的操作
業務本身的高頻次資料請求
其實有些業務,即使是中小型的平台,也會有高併發請求資料庫的情況,常見的例子如:日誌。例如,我們需要抓取到所有人的操作日誌,或者所有模組的載入時間,並且持久化儲存。如果,當初選型通過mysql去記錄這些資料,那麼就很容易遇到高併發的問題。這種就是屬於選型的錯誤了。
資料庫對高併發的處理一直是短板,所以應該盡量避免高併發的資料庫操作,查詢通過快取處理,增刪改這可以通過mq或者kafka這樣的工具非同步進行處理,如果對資料庫的結構化要求不高,則可以用hbase或者hive進行資料庫的儲存。
現在資料庫的操作都是使用執行緒池的,執行緒池主要是用來控制資料庫的連線數,其實連線池是不屬於資料庫範疇,但是,一般我們使用和資料庫結合非常緊密,所以在這裡一併說明。
一般執行緒池都會有這樣的幾個引數:
引數說明
最小連線數
不管是否有資料庫的操作,這幾個連線都會一直存在,
最大連線數
允許的最大的連線數,如果超過了這個資料,則無法申請連線,只能等待,或者異常
**時間
多長時間會對所有的連線進行一次斷開,然後重新連線。
釋放時間
多長時間沒有進行操作的連線,會釋放
基本所有的連線池都會有這幾個引數,可能不同的連線池引數名不同,但是作用是一樣的。 這裡我們重點說一下最大連線數,這個是很容易忽略的乙個設定。
很多人設定最大連線數的時候,喜歡設定的很大,例如設定為5000,但是一般mysql的資料庫乙個例項連線預設才1000,連線數超過這個了資料庫也無法處理,設定的再大其實是沒用的。
伺服器數量 * 最大連線數 < 資料庫最大連線數而且,這還是在乙個例項,乙個資料庫的情況下,至於多個資料庫:
我建議
伺服器數量 * 最大連線數 * 資料庫數量 < 資料庫最大連線數如果單個資料庫占用了太多的資料庫連線,會影響到其他資料庫,導致其他資料庫也無法使用。
當然,這個值大家可以根據業務去進行合理的估算,高頻的業務分配多一點,低頻的業務分配少一點。不要盲目的一味設定連線池的最大值。
如今,雖然各種各樣的儲存方式出現,但是關聯式資料庫一直是我們系統的最重要的組成部分,盡量不要過早暴露資料庫應對併發的短板,設計資料庫和運算元據庫在我們的開發中應該是一件很神聖的事情,認證對待關係的資料庫的每乙個操作才是明智之舉。
資料庫的使用你可能忽略了這些 續
之前寫過一篇文章 資料庫的使用你可能忽略了這些 主要是從一些大家使用使用時容易忽略的地方,如 字段長度 表設計等來說明,這篇文章同樣也是這樣的主題,只是從另外的幾個方面來說說資料庫使用中,容易忽略,導致入坑的地方。在資料庫進行表設計的時候,就應該評估可能產生的資料量,資料量會對整個開發和 的健壯性有...
UniDAC使用SQLite資料庫可能碰到的問題
如果說要使用第三方控制項來鏈結運算元據庫,我想unidac絕對是個很好的選擇。對於sqlite來說,像這樣能較好支援中文的第三方控制項更是少有了。不過使用unidac來說可能會碰到一些有趣的問題,特別是對於新手來說。現在說說我安裝控制項後使用sqlite碰到的問題 一 sqlite3.dll 不能被...
不可忽略的資料庫快取重建
引用 本文的主要內容 於mongodb官方部落格,由nosqlfan補充說明,本文對傳統的分布式cache系統進行了分析,指出了其在快取重建中會對資料庫產生巨大壓力的問題。並分析了mongodb的mmap方案是如何規避這一問題的。如下圖的架構,在資料庫前端加上分布式的cache 比如我們常用的mem...