网站建设大概多少费用/web设计一个简单网页
数据库分库分表
- 1、数据库分表的基本介绍
- 1.1 为什么分库分表
- 1.2 数据库 库表的拆分方式
- 2、两种技术模式的基本介绍
- 2.1 分库分表的技术模式
- 2.1 Sharding-JDBC
- 2.2 MyCat
- 3、数据库表结构的自动生成
- 3.1为什么要使用数据表自动生成
- 3.2 Freemarker的基本使用
- 3.3 表结构自动生成步骤
1、数据库分表的基本介绍
1.1 为什么分库分表
一般mysql单表存储数据量小于1千万左右的时候,它的读写性能是最好的。
但是当业务发展到一定程度,数据增长到一定程度的时候,我们就会发现为什么查询速度越来越慢了,甚至还会出现数据库挂了等其他一系列问题。
此时我们就需要采取一些方案来解决这些问题,一般如下三种:
1、分库分表
2、读写分离
3、利用NoSql
1.2 数据库 库表的拆分方式
数据库拆分方式有两种:垂直拆分和水平拆分
1)垂直拆分
垂直拆分的核心理念是专库专用。拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。
由上到下
2)水平拆分
它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。
由上到下
2、两种技术模式的基本介绍
2.1 分库分表的技术模式
1)中间件Proxy模式(MyCat)
Proxy属于中间层方案,在应用程序和MySQL之间搭建一层Proxy。中间层介于应用程序与数据库间,需要做一次转发,基于JDBC协议转发,例如Mycat
2)Client客户端模式(Sharding-JDBC)
Client模式属于客户端直连方案。此方案的优势在于轻便,对兼容性、性能以及DBA影响小。 例如当当网的sharding-jdbc,阿里的TDDL
2.1 Sharding-JDBC
Sharding-JDBC的基本使用总结
2.2 MyCat
MyCat的基本使用总结
3、数据库表结构的自动生成
3.1为什么要使用数据表自动生成
在实际业务中譬如日志表,我们希望每月的日志表分开,每当下一个月创建一个新的日志表,这样既可以分担数据库压力,又可以进行分类便于查找。
此时我们就需要用到Freemarker模板引擎技术来解决数据库表的自动生成。
3.2 Freemarker的基本使用
Freemarker的基本使用
3.3 表结构自动生成步骤
1)分析建表语句,提炼数据类型
2)使用工具类:GenerateSqlUtils,生成sql文件
3)在src/main/resources/ftl目录下创建模板文件如:sql.ftl
4)改造模板文件
对于变化位置,相应填充变量即可结果如下:
<#list 0..sqlbean.db_count-1 as db_no>
DROP database if exists `chongba_schedule${db_no}`;
CREATE DATABASE `chongba_schedule${db_no}` DEFAULT CHARACTER SET utf8;
USE `chongba_schedule${db_no}`;
<#list 0..sqlbean.taskinfo_count-1 as taskinfo_no>
CREATE TABLE `taskinfo_${taskinfo_no}` (
`task_id` bigint(20) NOT NULL comment '任务id',
`execute_time` datetime(3) NOT NULL comment '执行时间',
`parameters` longblob comment '参数',
`priority` int(11) NOT NULL comment '优先级',
`task_type` int(11) NOT NULL comment '任务类型',
PRIMARY KEY (`task_id`),
KEY `index_taskinfo_time` (`task_type`,`priority`,`execute_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</#list>
<#list sqlbean.taskinfo_logs_monthList as month>
CREATE TABLE `taskinfo_logs_${month}` (
`task_id` bigint(20) NOT NULL COMMENT '任务id',
`execute_time` datetime(3) COMMENT '执行时间',
`parameters` longblob COMMENT '参数',
`priority` int(11) NOT NULL COMMENT '优先级',
`task_type` int(11) NOT NULL COMMENT '任务类型',
`version` int(11) NOT NULL COMMENT '版本号,用乐观锁',
`status` int(11) DEFAULT '0' COMMENT '状态 0=初始化状态 1=EXECUTED 2=CANCELLED',
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</#list>
</#list>
4)对应yaml配置文件进行修改