一、為什么MySQL數據庫數據量大了要進行分庫分表
隨著用戶量的激增和時間的堆砌,存在數據庫里面的數據越來越多,此時的數據庫就會產生瓶頸,出現資源報警、查詢慢等場景。
首先單機數據庫所能承載的連接數、I/O及網絡的吞吐等都是有限的,所以當并發量上來了之后,數據庫就漸漸頂不住了。
再則,如果單表的數據量過大,查詢的性能也會下降。因為數據越多 B+ 樹就越高,樹越高則查詢 I/O 的次數就越多,那么性能也就越差。
因為上述的原因,不得已就得上分庫分表了。
把以前存在一個數據庫實例里的數據拆分成多個數據庫實例,部署在不同的服務器中,這是分庫。
把以前存在一張表里面的數據拆分成多張表,這是分表。
一般而言:
分表:是為了解決由于單張表數據量多大,而導致查詢慢的問題。大致三、四千萬行數據就得拆分,不過具體還是得看每一行的數據量大小,有些字段都很小的可能支持更多行數,有些字段大的可能一千萬就頂不住了。分庫:是為了解決服務器資源受單機限制,頂不住高并發訪問的問題,把請求分配到多臺服務器上,降低服務器壓力。延伸閱讀:
二、主要的單機存儲引擎
1、哈希存儲:hash的CRUD是非常快的。但缺點是不支持順序掃描。bitcask是一個基于hash表結構的存儲系統。他將寫操作(包括刪除標識)追加到文件尾。并定期合并新老文件&記錄。
2、B樹:既支持隨機讀取又支持范圍查找的系統。查找時間復雜度為logd(n)(d為每個節點的出度)。Mysql的InnoDB的引擎和OS的文件系統使用的就是B+樹。(為什么選擇使用B樹的變種B+樹,讀者有興趣可以去探究下。提示:磁盤讀取)
3、LSM樹(Log Structured Merge Tree):由B+數改進而來。其思想為:將增量寫操作保存在內存中,超過閾值時刷入磁盤,從而減少隨機寫磁盤操作。讀操作則需要合并磁盤數據和內存中的寫操作。通過Memtable/SSTable實現,實現細節在此不做深入探究。比較適合寫操作較多的業務場景。BigTable/HBase/Cassandra中的列簇的數據存儲方式采用的即是LSM樹。