MySQL分庫分表總結

MySQL分庫分表總結:


單庫單表 :


單庫單表是最常見的數據庫設計,例如,有一張用戶(user)表放在數據庫db中,所有的用戶都可以在db庫中的user表中查到。?


單庫多表 :


隨著用戶數量的增加,user表的數據量會越來越大,當數據量達到一定程度的時候對user表的查詢會漸漸的變慢,從而影響整個DB的性能。如果使用

mysql, 還有一個更嚴重的問題是,當需要添加一列的時候,mysql會鎖表,期間所有的讀寫操作只能等待。?可以通過某種方式將user進行水平的切分,產生兩個表結構完全一樣的user_0000,user_0001等表,user_0000 + user_0001 + …的數據剛好是一份完整的數據。?


多庫多表 :


隨著數據量增加也許單臺DB的存儲空間不夠,隨著查詢量的增加單臺數據庫服務器已經沒辦法支撐。這個時候可以再對數據庫進行水平區分。?

分庫分表規則 :

???????? 設計表的時候需要確定此表按照什么樣的規則進行分庫分表。例如,當有新用戶時,程序得確定將此用戶信息添加到哪個表中;同理,當登錄的時候我們得通過用戶的賬號找到數據庫中對應的記錄,所有的這些都需要按照某一規則進行。?
路由?
???????? 通過分庫分表規則查找到對應的表和庫的過程。如分庫分表的規則是user_id mod 4的方式,當用戶新注冊了一個賬號,賬號id的123,我們可以通

過id mod 4的方式確定此賬號應該保存到User_0003表中。當用戶123登錄的時候,我們通過123 mod 4后確定記錄在User_0003中。?


分庫分表產生的問題,及注意事項?


1.?? 分庫分表維度的問題?

假如用戶購買了商品,需要將交易記錄保存取來,如果按照用戶的緯度分表,則每個用戶的交易記錄都保存在同一表中,所以很快很方便的查找到某用

戶的購買情況,但是某商品被購買的情況則很有可能分布在多張表中,查找起來比較麻煩。反之,按照商品維度分表,可以很方便的查找到此商品的購

買情況,但要查找到買人的交易記錄比較麻煩。?


所以常見的解決方式有:?

???? a.通過掃表的方式解決,此方法基本不可能,效率太低了。?

???? b.記錄兩份數據,一份按照用戶緯度分表,一份按照商品維度分表。?

???? c.通過搜索引擎解決,但如果實時性要求很高,又得關系到實時搜索。?

2.?? 聯合查詢的問題?

聯合查詢基本不可能,因為關聯的表有可能不在同一數據庫中。?

3.?? 避免跨庫事務?

避免在一個事務中修改db0中的表的時候同時修改db1中的表,一個是操作起來更復雜,效率也會有一定影響。?

4.?? 盡量把同一組數據放到同一DB服務器上?

例如將賣家a的商品和交易信息都放到db0中,當db1掛了的時候,賣家a相關的東西可以正常使用。也就是說避免數據庫中的數據依賴另一數據庫中的數據。?

一主多備?

在實際的應用中,絕大部分情況都是讀遠大于寫。Mysql提供了讀寫分離的機制,所有的寫操作都必須對應到Master,讀操作可以在Master和Slave機器上進行,Slave與Master的結構完全一樣,一個Master可以有多個Slave,甚至Slave下還可以掛Slave,通過此方式可以有效的提高DB集群的QPS.???????????????????????????????????????????????????????

所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。?

此外,可以看出Master是集群的瓶頸,當寫操作過多,會嚴重影響到Master的穩定性,如果Master掛掉,整個集群都將不能正常工作。?

所以,1. 當讀壓力很大的時候,可以考慮添加Slave機器的分式解決,但是當Slave機器達到一定的數量就得考慮分庫了。 2. 當寫壓力很大的時候,就必須得進行分庫操作。?

---------------------------------------------?

MySQL使用為什么要分庫分表?
可以用說用到MySQL的地方,只要數據量一大, 馬上就會遇到一個問題,要分庫分表.?
這里引用一個問題為什么要分庫分表呢?MySQL處理不了大的表嗎??
其實是可以處理的大表的.我所經歷的項目中單表物理上文件大小在80G多,單表記錄數在5億以上,而且這個表?
屬于一個非常核用的表:朋友關系表.?

但這種方式可以說不是一個最佳方式. 因為面臨文件系統如Ext3文件系統對大于大文件處理上也有許多問題.?
這個層面可以用xfs文件系統進行替換.但MySQL單表太大后有一個問題是不好解決: 表結構調整相關的操作基?
本不在可能.所以大項在使用中都會面監著分庫分表的應用.?

從Innodb本身來講數據文件的Btree上只有兩個鎖, 葉子節點鎖和子節點鎖,可以想而知道,當發生頁拆分或是添加?
新葉時都會造成表里不能寫入數據.?
所以分庫分表還就是一個比較好的選擇了.?

那么分庫分表多少合適呢??
經測試在單表1000萬條記錄一下,寫入讀取性能是比較好的. 這樣在留點buffer,那么單表全是數據字型的保持在?
800萬條記錄以下, 有字符型的單表保持在500萬以下.?

如果按 100庫100表來規劃,如用戶業務:?
500萬*100*100 = 50000000萬 = 5000億記錄.?

心里有一個數了,按業務做規劃還是比較容易的.


分布式數據庫架構--排序、分頁、分組、實現

最近研究分布式數據庫架構,發現排序、分組及分頁讓著實人有點頭疼。現把問題及解決思路整理如下。

一、 多分片(水平切分)返回結果合并(排序)

??????????1、Select + None Aggregate Function的有序記錄合并排序?

????????? ?解決思路:對各分片返回的有序記錄,進行排序去重合并。此處主要是編寫排序去重合

????????? 并算法。

????????? 2、Select + None Aggregate Function的無序記錄合并

????????? ?解決思路:對各分片返回的無序記錄,進行去重合并。

????????? ?優點:實現比較簡單。

????????? ?缺點:數據量越大,字段越多,去重處理就會越耗時。

????????? 3、Select + Aggregate Function的記錄合并(排序)

????????? Oracle常用聚合函數:Count、Max、Min、Avg、Sum。

????????? AF:Max、Min

????????? 思路:通過算法對各分片返回結果再求max、min值。

????????? AF:Avg、Sum、Count

????????? 思路:分片間無重復記錄或字段時,通過算法對各分片返回結果再求avg、sum、count值。分片間有重復記錄或字段時,先對各分片記錄去重合并,再通過算法求avg、sum、count值。

????????? 比如:

????????? select count(*) from user

????????? select count(deptno) from?user;

?????? ?? select count(distinct deptno) from?user;

二、多分片(水平切分)返回結果分頁

?????????解決思路:合并各分片返回結果,邏輯分頁。

????????優點:??實現簡單。

????????缺點:??數據量越大,緩存壓力就越大。

?????????????????? ? 分片數據量越大,查詢也會越慢。

三、多分片(水平切分)查詢有分組語法的合并

???????? 1、Group By Having + None Aggregate Function時

???????? Select + None Aggregate Function

???????? 比如:select?job?user?group?by?job;

??????? 思路:直接去重(排序)合并。

??????? Select + Aggregate Function

???????? 比如:select?max(sal),job?user?group?by?job;

???????? 思路:同Select + Aggregate Function的記錄合并(排序)。

???????? 2、Group By Having + Aggregate Function時

???????? 解決思路:去掉having AF條件查詢各分片,然后把數據放到一張表里。再用group by having 聚合函數查詢。

四、分布式數據庫架構--排序分組分頁參考解決方案

???????? 解決方案1:Hadoop + Hive。

???????? 思路:使用Hadoop HDFS來存儲數據,通過Hdoop MapReduce完成數據計算,通過Hive HQL語言使用部分與RDBBS一樣的表格查詢特性和分布式存儲計算特性。

???????? 優點: 可以解決問題

????????????????????? ?具有并發處理能力

?????????????????????? 可以離線處理

???????? 缺點:??實時性不能保證

????????????????????? ?網絡延遲會增加

????????????????????? ?異常捕獲難度增加

?????????????????????? Web應用起來比較復雜

????????? 解決方案2:總庫集中查詢。

????????? 優點: 可以解決問題 ???????

?????????????????????? 實現簡單

????????? 缺點: 總庫數據不能太大

??????????????????????? 并發壓力大

五、小結

?????????對 于分布式數據庫架構來說,排序、分頁、分組一直就是一個比較復雜的問題。避免此問題需要好好地設計分庫、分表策略。同時根據特定的場景來解決問題。也可以 充分利用海量數據存儲(Hadoop-HDFS|Hive|HBse)、搜索引擎(Lucene|Solr)及分布式計算(MapReduce)等技術來 解決問題。
別外,也可以用NoSQL技術替代關系性數據庫來解決問題,比如MogonDB\redis。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3章 RxJava操作符

本篇文章已授權微信公眾號 YYGeeker 獨家發布轉載請標明出處 CSDN學院課程地址 RxJava2從入門到精通-初級篇:edu.csdn.net/course/deta…RxJava2從入門到精通-中級篇:edu.csdn.net/course/deta…RxJava2從入門到精通-進階篇:edu.csdn.net/course/deta…RxJava2從入門到精通-源碼…

virtualbox 使用

實現文件拖拽功能 1、設備 -- 安裝增強功能 -- /bin/sh VboxLinuxaddition.run -- reboot 2、設備 -- 拖放 -- 雙向 3、虛擬機 -- 設置 -- 存儲 -- 控制器:SATA -- 勾選 使用主機輸入輸出(I\O 緩存) 4、虛擬機硬盤 -- 勾選固態驅動器 轉載于…

linux安裝mysql 5.6.33

.到MySQL官網下載mysql編譯好的二進制安裝包,在下載頁面Select Platform:選項選擇linux-generic,然后把頁面拉到底部,64位系統下載Linux - Generic (glibc 2.5) (x86, 64-bit),下載后文件名:mysql-5.6.33-linux-glibc2…

Go 函數特性和網絡爬蟲示例

爬取頁面 這篇通過網絡爬蟲的示例,來了解 Go 語言的遞歸、多返回值、延遲函數調用、匿名函數等方面的函數特性。首先是爬蟲的基礎示例,下面兩個例子展示通過 net/http 包來爬取頁面的內容。 獲取一個 URL 下面的程序展示從互聯網獲取信息,獲…

Qt的安裝和使用中的常見問題(詳細版)

對于太長不看的朋友,可參考Qt的安裝和使用中的常見問題(簡略版)。 目錄 1、引入2、Qt簡介3、Qt版本 3.1 查看安裝的Qt版本3.2 查看當前項目使用的Qt版本3.3 查看當前項目使用的QtCreator版本3.4 Linux命令行下查看和使用不同版本的Qt4、Qt模塊…

python與C#的互相調用

python與C#的互相調用一、C#調用python新建一個項目,添加引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安裝目錄中)。創建一個文本文件命名為hello.py,把該文件添加的當前的項目中,并設置為總是輸出。#…

各行業大數據可視化界面參考

轉載于:https://www.cnblogs.com/wangsongbai/p/10178096.html

mysql遠程連接 Host * is not allowed to connect to this MySQL server

localhost改成% 進入mysql的BIN目錄 代碼如下 復制代碼 mysql -u root -p mysql>use mysql; mysql>update user set host ’%where user ’root’; mysql>flush privileges; 具體分析 1、在本機登入mysql后,更改“mysql”數據庫里的“user”表里的“h…

今日聽聞這幾款手機軟件比較火爆 果然名不虛傳!

如今的時代,智能手機已經成為我們生活中不可缺少的一部分,大家之所以這么愛玩手機,其實并不是手機本身有多么吸引人,而是安裝在手機上的各種各樣的APP,比如各種社交軟件、音頻軟件、購物軟件以及地圖軟件等等。下面我們…

setdefault()方法

setdefault()方法 描述 字典 setdefault() 方法和 get()方法類似,返回指定鍵的值,如果鍵不在字典中,將會添加鍵并將值設置為一個指定值,默認為None。 get() 和 setdefault() 區別: setdefault() 返回的鍵如果不在字典中&#xff0…

Hive2.1.1、Hadoop2.7.3 部署

本文以遠程模式安裝Hive2.1.1將hive的元數據放置在MySQL數據庫中。 1 安裝mysql數據庫 sudo apt-get install mysql-server11 重啟mysql服務使得配置文件生效 sudo service mysql restart11 創建hive專用賬戶 CREATE USER hive% IDENTIFIED BY 123456;11 給hive賬戶授予所有權限…

Django 的簡單ajax

需要通過ajax實現局部刷新 js代碼 $(#guo-sou-ajax).click(function(){ #獲取id為guo-sou-ajax點擊后的信號console.log($(this).attr("data-action")) $.ajax({ #調用ajaxurl: $(this).attr("data-action"), #url保存在標簽里面的data-actio…

postman提取返回值

Postman是做接口測試的,但是很多接口并不是直接就能測,有的需要一些預處理。比如說身份認證,需要傳遞一個token。如果做網頁測試,一般打開登陸界面的時候就會生成一個token,如果返回值是json格式,用Postman…

docker下用keepalived+Haproxy實現高可用負載均衡集群

啟動keepalived后宿主機無法ping通用keepalived,報錯: [rootlocalhost ~]# ping 172.18.0.15 PING 172.18.0.15 (172.18.0.15) 56(84) bytes of data. From 172.18.0.1 icmp_seq1 Destination Host Unreachable From 172.18.0.1 icmp_seq2 Destination H…

hadoop hive 2.1.1 將Hive啟動為服務

我們之前使用的Shell方式與Hive交互只是Hive交互方式中的一種,還有一種就是將Hive啟動為服務,然后運行在一個節點上,那么剩下的節點就可以使用客戶端來連接它,從而也可以使用Hive的數據分析服務。 前臺模式 可以使用下面的命令來將…

大數據學習要知道的十大發展趨勢,以及學習大數據的幾點建議

2016年,近40%的公司正在實施和擴展大數據技術應用,另有30%的公司計劃在未來12個月內采用大數據技術,62.5%的公司現在至少有一個大數據項目投入生產,只有5.4%的公司沒有大數據應用計劃,或者是沒有正在進行的大數據項目&…

pickle 模塊

import pickle # class Elephant:def __init__(self, name, weight, height):self.name nameself.weight weightself.height heightdef tiaoxi(self):print(f"{self.name}大象特別喜歡調戲人")# e Elephant("寶寶", "185T", "175"…

Hiv:SQuirrel連接hive配置

熟悉了Sqlserver的sqlserver management studio、Oracle的PL/SQL可視化數據庫查詢分析工具,在剛開始使用hive、phoenix等類sql組件時,一直在苦苦搜尋是否也有類似的工具,不負所望,SQuirrel Sql client 可視化數據庫工具基本可滿足…

MariaDB 數據庫索引詳解(9)

MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于現在閉源了,而能輕松成為MySQL的代替品.在存儲引擎方面,使用XtraDB來代替MySQL的InnoDB,MariaDB由MySQL的創始人Michael Widenius主導開發…

Kettle連接Hive2的問題解決思路

在kettle上當選擇好HIVE2連接時候有報錯 org.pentaho.di.core.exception.KettleDatabaseException: Error occured while trying to connect to the databaseError connecting to database: (using class org.apache.hive.jdbc.HiveDriver)org/apache/http/client/CookieStore…