mysql分庫分表之mycat中介軟體解決方案
專案運營期間隨著時間的推移線上環境的資料越來越多,線上的sql跑的越來越慢,當資料表增加的千萬級別資料,單純的增加索引已經不能解決
線上的慢sql問題,這時,分表 ,分割槽,分庫應運而生;小弟不才剛接觸了分表,分庫,現在分享下,有問題多多指教,見笑。
1 mysql分表分為水平切分,和垂直切分
垂直分割(並不常用)
就是將一個表按照欄位來分,每張表保證有相同的主鍵就好。一般來說,將常用欄位和大欄位分表來放。
優勢:比沒有分表來說,提高了查詢速度,降低了查詢結果所用記憶體;
劣勢:沒有解決大量記錄的問題,對於單表來說隨著記錄增多,效能還是下降很快;
2 水平分割(重要,實際應用中使用最多)
水平分割是企業最常用到的,水平拆分就是大表按照記錄分為很多子表:
水平分的規則完全是自定義的,有以下幾種參考設計:
1 hash、自增id取模:
對某個欄位進行hash來確定建立幾張表,並根據hash結果存入不同的表;
2 按時間
根據業務可以按照天、月、年來進行拆分;
3 按每個表的固定記錄數
一般按照自增ID進行拆表,一張表的資料行到了指定的數量,就自動儲存到下一張表中。比如規定一張表只能存1-1000個記錄;
4 將老資料遷移到一張歷史表
比如日誌表,一般只查詢3個月之內的資料,對於超過3個月的記錄將之遷移到歷史子表中;
分表時需要的設計:
查詢時:要根據預定義規則查詢不同的子表;
select/update/delete時:極有可能涉及多張表,必須在程式邏輯上的事務中都包括好所有的表。
表分的不好,對後期sql影響很大,所以分表也是一門學問;
1 分表可以在程式碼層級實現;
2 也可以用資料庫中介軟體實現,現在流行的有 mycat和sharing-sphere,省去了我們很多時間;
本文主講mycat中介軟體配置分表,分庫;
首先mycat 的下載地址 https://github.com/MyCATApache/Mycat-download 建議下載1.6-RELEASE 以上版本
mycat的安裝教程本文省去,可自行百度
安裝完成後,目錄如下:
目錄 說明
bin mycat命令,啟動、重啟、停止等
catlet catlet為Mycat的一個擴充套件功能
conf Mycat 配置資訊,重點關注
lib Mycat引用的jar包,Mycat是java開發的
logs 日誌檔案,包括Mycat啟動的日誌和執行的日誌。
conf先三個重要的檔案
rule.xml schema.xml server.xml
MyCAT目前通過配置檔案的方式來定義邏輯庫和相關配置:
· MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節點等內容;
· MYCAT_HOME/conf/rule.xml中定義分片規則;
· MYCAT_HOME/conf/server.xml中定義使用者以及系統相關變數,如埠等。
首先server.xml配置 如果是資料庫root使用者配置密碼以及schemas;
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表級 DML 許可權設定 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
如果是其他使用者
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
然後配置schema.xml 檔案
1 分庫操作,像下圖中<table name = "item" dataNode="node_db2,node_db3" rule="rule1"></table>schema標籤裡面配置;
2 單庫多表 <table name="adminusers" subTables="adminusers$1-4" dataNode="node_db01" rule="dankufenbiao-mod-long"></table>
配置rule.xml 規則
根據userid取模分表
<function name="dankufenbiao-mod-long"><property name="count">4</property></function>中的count代表分表的數量
這樣mycat的配置基本算是完成了,然後啟動命令
mycat.bat start
啟動後可以通過如下命令檢視mtcat執行狀態
mycat.bat status
可以使用如下命令停止mycat服務
mycat.bat stop
這樣mycat的環境基本部署完成了,下面就是啟動專案
是個springboot的mycatdemo專案中需要注意的是application.properties
中資料來源
#配置資料來源 |
#mycat的連線賬號和密碼 |
spring.datasource.druid.username=root |
spring.datasource.druid.password=123456 |
#mycat的邏輯庫 埠也是mycat的配置檔案的schem名稱 |
spring.datasource.druid.url=jdbc:mysql://localhost:8066/TESTDB |