项目运营期间随着时间的推移线上环境的数据越来越多,线上的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的环境基本部署完成了,下面就是启动项目

详情可以查看git 地址mycatdemo

是个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

  

 

Logo

更多推荐