1. 程式人生 > >mysql分庫分表之mycat中介軟體解決方案

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