1. 程式人生 > 其它 >MySql之資料庫分庫分表中介軟體mycat

MySql之資料庫分庫分表中介軟體mycat

一、mycat的安裝

環境準備:準備一臺虛擬機器192.168.152.128

1. 下載mycat

cd /software
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2. 解壓mycat

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

3. 剪下mycat到/usr/local目錄下

mv /software/mycat /usr/local

4. 啟動mycat

 /usr/local/mycat/bin/mycat start 啟動 
 /usr/local/mycat/bin/mycat status  檢視啟動狀態

說明:這裡有個小插曲,啟動一會mycat又會自己停止

通過檢視日誌

vim /usr/local/mycat/logs/wrapper.log

報:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0

這是因為使用的是jdk8的版本,jdk8以後就沒有永久代了,而mycat的wrapper.conf裡面配置了jdk8以前的永久代的記憶體大小,我們只需要註釋這個配置就可以了

重新啟動mycat:

/usr/local/mycat/bin/mycat start

就不會出現啟動一會又自己停止的問題了

連線mycat:

mysql -uroot -p123456 -h192.168.152.128 -P8066

可以看到mycat連線成功

5. linux下mycat常用命令

 /usr/local/mycat/bin/mycat start 啟動 
 /usr/local/mycat/bin/mycat stop 停止 
 /usr/local/mycat/bin/mycat console 前臺執行 
 /usr/local/mycat/bin/mycat restart 重啟服務 
 /usr/local/mycat/bin/mycat pause  暫停 
 /usr/local/mycat/bin/mycat status  檢視啟動狀態

二、mycat配置詳解

1. 首先檢視mycat的檔案目錄

mycat的主要配置檔案都在conf目錄下,核心的配置檔案是schema.xml、server.xml、rule.xml這3個配置檔案,下面我們來對這3個配置檔案進行詳細介紹

2.schema.xml

是Mycat最重要的配置檔案之一。主要管理Mycat邏輯庫、邏輯表、表、分片規則、DataSource。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!--
    schema標籤:指定Mycat的邏輯庫(mycat的Schema,可以指定多個schema標籤)
    
    checkSQLschema屬性:
        False 過濾schema定義。
        select * from testdb.company;=> select * from company;
        True  不過濾schema定義,當我們把testdb輸錯了或者沒有設定大小寫敏感就會報錯
    
    sqlMaxLimit屬性:
        Limit 自動加入limit,查詢語句如果沒有加入分頁引數,當資料量很大的時候,mycat認為會有問題時就啟用這個引數只返回100條。例如:select * from company。    
    -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> 
        <!-- 
        
        table標籤:指定Mycat中的邏輯表。最後要做資料分片的表。mycat中的表,可以和實體有具體對映關係,也可以沒有具體對映關係(如果沒有對映關係會報錯)。
        dataNode屬性:資料節點,把相應的表存到對應的DB中。
        rule屬性:分片規則。對應rule.xml中的規則。
        ruleRequired屬性:指定該屬性的表是否需要分片規則。True 必須制定,如果沒有制定,就會報錯。        
     primaryKey屬性:值為具體的物理表的主鍵id,如果使用非主鍵進行分片,那麼Mycat會快取主鍵和具體dataNode的資訊,如果下次再使用非主鍵進行查詢的時候,就不用廣播所有dn。 type屬性:邏輯表的型別。普通表和全域性表,全域性表不需要分片,是為了解決跨庫join的,全域性表一般是資料量比較小、基本不會增長的表 autoIncrement屬性:Mycat根據last_insert_id()返回結果。這個需要和mysql自增長主鍵配合。 needAddLimit屬性:是否自動在每一條SQL語句後面加上limit限制。 --> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> <!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> <!-- random sharding using mod sharind rule --> <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" /> <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global" needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3" rule="mod-long" /> --> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> --> </schema> <!-- dataNode標籤:定義資料節點 dataHost屬性: 主機的名稱 database屬性: 資料庫 --> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /> <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> <dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /> <dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --> <!-- dataHost標籤:主要定義和Mysql叢集有關的資訊,資料例項、讀寫分離配置和心跳檢測語句。 balance屬性:讀操作負載均衡配置 0 代表不開啟讀寫分離,所有的讀操作都發送到writeHost上。 1 writeHost和readHost都要參與select語句的負載均衡。例如:雙主雙從模式 M1->S1, M2->S2, M1和M2互為主備。M2/S1/S2都要參與select語句的負載均衡。 2 所有讀操作都隨機分配給writeHost/readHost 3 所有的讀操作隨機分發到writeHost下面的readHost上執行。 writeType屬性:寫操作負載均衡配置 0 所有的寫操作都分發到第一個writeHost。如果第一個掛了,分發到第二個。 1 所有的寫操作都要隨機分發到所有配置的writeHost上。1.5以後不推薦。 dbType屬性:支援的資料庫型別,mycat支援多種db型別:mysql、oracle等 switchType屬性:切換型別,主備切換,主主切換。 -1 代表不自動切換 1 預設值,自動切換。對應的心跳檢測語句select user(); 2 基於Mysql主從同步的狀態決定是否切換。對應的心跳檢測語句show slave status; 3 基於MySQL Galera Cluster切換機制。對應的心跳檢測語句show status like ‘wsrep%’; maxCon屬性:單個writeHost/readHost節點的最大連線數 minCon屬性:單個writeHost/readHost節點的最小連線數 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> </writeHost> <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost> <!-- <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc"> <heartbeat> </heartbeat> <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost> </dataHost> <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat> <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql> <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost> <dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost> <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc"> <heartbeat> </heartbeat> <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> --> <!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql" dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost> </dataHost> --> </mycat:schema>

3.server.xml

主要用於管理Mycat的使用者名稱,許可權,黑白名單等等設定。這個檔案主要和Mycat Server執行環境有關。

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="useSqlStat">0</property>  <!-- 1為開啟實時統計、0為關閉 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1為開啟全加班一致性檢測、0為關閉 -->

        <property name="sequnceHandlerType">2</property>
      <!--  <property name="useCompression">1</property>--> <!--1為開啟mysql壓縮協議-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--設定模擬的MySQL版本號-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--預設為type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
        <property name="processorBufferPoolType">0</property>
        <!--預設是65535 64K 用於sql解析時最大文字長度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分散式事務開關,0為不過濾分散式事務,1為過濾分散式事務(如果分散式事務內只涉及全域性表,則不過濾),2為不過濾分散式事務,但是記錄分散式事務日誌-->
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1開啟   0關閉
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            單位為m
        -->
        <property name="memoryPageSize">1m</property>

        <!--
            單位為k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            單位為m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否採用zookeeper協調切換  -->
        <property name="useZKSwitch">true</property>


    </system>
    
    <!-- 
    Firewall標籤:全域性SQL防火牆設定
        定義訪問控制策略:如白名單/黑名單
    -->
    <!-- 
    <firewall> 
       <whitehost>
          <host host="127.0.0.1" user="mycat"/>
          <host host="127.0.0.2" user="mycat"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    -->
    
    <!--
    User標籤:定義可訪問mycat的使用者名稱稱/密碼/是否只讀
    -->
    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
        
        <!--
        Privileges標籤:表級 DML 許可權設定
          控制DML:insert/update/select/delete
          單獨給select許可權:0010
          單獨給insert許可權:1000
        -->
        <!--         
        <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>

</mycat:server>

下面附一個表格說明server.xml的system標籤下的各個標籤和屬性的說明:

屬性

說明

備註

useSqlStat

開啟實時統計

1為開啟,0為關閉

useGlobleTableCheck

全域性表一致性檢測

1為開啟,0為關閉

sequnceHandlerType

Mycat全域性ID型別

0本地檔案方式
1資料庫方式
2時間戳序列方式
3分散式ZK ID生成器
4 ZK遞增ID生成

useCompression

mysql壓縮協議

1為開啟,0為不開啟

fakeMySQLVersion

偽裝的MySQL版本號

processorBufferChunk

每次分配Socket Direct Buffer大小

預設4096位元組

processors

系統可用執行緒數

預設Runtime.getRuntime().availableProcessors()返回值

processorExecutor

NIOProcessor共享businessExecutor執行緒池大小

processorBufferPoolType

每次分配Socket Direct Buffer大小

預設是4096個位元組

maxStringLiteralLength

sql解析時最大文字長度

預設是65535(即64K)

backSocketNoDelay

TCP連線相關屬性

預設值1

frontSocketNoDelay

TCP連線相關屬性

預設值1

serverPort

指定服務埠

預設8066

managerPort

指定管理埠

預設9066

idleTimeout

連線空閒時間

預設30分鐘,單位毫秒

bindIp

Mycat服務監聽的IP地址

frontWriteQueueSize

前端連線寫佇列長度

為了讓使用者知道是否佇列過長(SQL結果集返回太多)。當超過指定閥值後,會產生一個告警日誌

handleDistributedTransactions

分散式事務開關

0不過濾分散式事務
1過濾分散式事務
2不過濾分散式事務但記錄分散式事務日誌

useOffHeapForMerge

是否讓Mycat開啟非堆記憶體

1開啟,0關閉

memoryPageSize

記憶體分頁大小

useStreamOutput

是否使用流輸出

systemReserveMemorySize

系統保留記憶體大小

useZKSwitch

是否採用zookeeper協調切換

true/false

4. rule.xml

定義分片規則策略檔案。

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <!--
        tableRule標籤:定義table分片策略
    -->
    <tableRule name="rule1">
        <!--
        rule標籤:策略定義標籤
        -->
        <rule>
            <!--
            columns標籤:對應的分片欄位
            -->
            <columns>id</columns>
            <!--
            algorithm標籤:tableRule分片策略對應的function名稱
            -->
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <!--
    function標籤:定義分片函式
    -->
    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 預設是0 -->
        <property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一個實際的資料庫節點被對映為這麼多虛擬節點,預設是160倍,也就是虛擬節點數是物理節點數的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點預設是1。以properties檔案的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用於測試時觀察各物理節點與虛擬節點的分佈情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的對映按行輸出到這個檔案,沒有預設值,如果不指定,就不會輸出任何東西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的資料庫節點數量,必須指定,否則沒法分片 -->
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

rule是定義分片規則的

三、mycat工作原理

四、mycat基礎概念

1. mycat支援的資料庫

2. 邏輯庫(Schema)

在實際應用中,業務開發人員並不需要知道中介軟體的存在,只需要知道資料庫的概念,所以資料庫中介軟體可以被看作是一個或者多個數據庫叢集構成的邏輯庫。

3. 邏輯表

在分散式資料庫中,讀寫資料的表就是邏輯表。邏輯表,可以是資料切分後分布在一個或多個分片庫中,也可以不做資料切分不分片,只有一個表構成

4. DataNode、DataHost、Rule

DataNode:資料切分後,一個大表被分到不同的分片資料庫上面,每個分片所在的資料庫就是分片節點

DataHost:資料切分後,每個分片節點(DataNode)不一定都會獨佔一臺機器,同一機器上面可以有多個分片資料庫。一個或多個分片節點(DataNode)所在的機器就是節點主機(DataHost)

Rule:分片規則,選擇合適的分片規則很重要,將極大的避免後續處理資料的難度

5. myca分片原則

5.1 資料拆分之前的思考

分片規則雖然能解決大表對資料庫系統的壓力,但它並不是萬能的,也有一些不利之處。因此首要問題是:

1)分不分庫

2)分哪些庫

3)什麼規則分

4)分多少片

5.2 mycat資料切分原則

1)達到一定數量級才分,一般是單表達到800萬資料就要考慮資料拆分了。

2)不到800萬,但跟大表(超800萬的表)有關聯查詢的表也要拆分,在此稱為大表關聯表

3)大表關聯表如何拆分:小於100萬的使用全域性表;大於100萬小於800萬跟大表使用同樣的拆分策略;無法跟大表使用相同規則的,可以考慮從java程式碼上分步驟查詢,不用關聯查詢,或者破例使用全域性表。

4)全域性表:如品牌表250萬,跟大表order關聯,又無法跟大表使用同樣的拆分策略,也做成了全域性表。全域性表必須滿足的條件:沒有太激烈的併發update(如多執行緒同時update同一條記錄);雖有多執行緒update,但不是操作同一條記錄;批量insert沒問題。

5)拆分欄位是不可修改的

6)拆分欄位只能是一個欄位,如果想按照兩個欄位拆分,必須新建一個冗餘欄位,冗餘欄位的值使用兩個欄位的值拼接而成(如大區+年月拼接成:“區域_年月日” 欄位)

7)拆分演算法的選擇和合理性判斷:按照選定的演算法拆分後每個庫中單表不得超過800萬記錄

8)能不拆分的儘量不拆分。如果某個表不跟其他表關聯查詢,資料量又少、直接不拆分,使用單庫即可

5.3 Mycat分庫分表原則

1)能不分就不分,1000萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決效能問題

2)分片數量儘量少,分片儘量均勻分佈在多個DataHost上,因為一個查詢SQL跨分片越多,則總體效能越差,雖然要好於所有資料在一個分片的結果,只在必要的時候進行擴容,增加分片數量。

3)分片規則需要慎重選擇,分片規則的選擇,需要考慮資料的增長模式,資料的訪問模式,分片關聯性問題,以及分片擴容問題,最近的分片策略為範圍分片,列舉分片,一致性Hash分片,這幾種分片都有利於擴容

4)儘量不要在一個事物中的SQL跨越多個分片,分散式事物一直是一個不好處理的問題

5)查詢條件儘量優化,儘量避免select * 的方式,大量資料結果集下,會消耗大量的CPU資源和頻寬,查詢應儘量避免返回大的結果集,並且應儘量為頻繁使用的查詢語句建立索引

5.4 mycat常用分片規則

1)時間類:按天分片、自然月分片、單月小時分片

2)雜湊類:Hash固定分片、日期範圍Hash分片、擷取數字Hash求模範圍分片、擷取數字Hash分片、一致性Hash分片

3)取模類:取模分片、取模範圍分片、範圍求模分片

4)其他類:列舉分片、範圍約定分片、應用指定分片、冷熱資料分片