分库分表带来的问题及解决方案
Posted 武魂95级蓝银草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分库分表带来的问题及解决方案相关的知识,希望对你有一定的参考价值。
一.理解分库分表的意义
1.什么情况下不分表
阿里巴巴java开发手册嵩山版p14
1.1、能不分就别分
1.2、长期规划(3~5年)
二.什么情况下分表
2.1数据库性能瓶颈的出现:连接、速度、存储
2.2数据库优化的层次
1、SQL与索引(合格的sql和索引)
2、表与存储引擎(表选择正确的存储引擎)
3、数据库与应用架构(应用设计是否合理,是否利用了redis等缓存等)
4、数据库与操作系统配置
5、硬件
6、分库分表
三.分库分表的类型和特点
3.1水平切分
3.2垂直切分
四.分库分表带来的问题
4.1、跨库关联查询
4.2、分布式事务
4.3、排序、翻页、函数计算
4.4、全局主键
五.多数据源(动态数据源)的解决方案(datasource)
六全局id问题
server.xml中配置
0、文件方式1、数据库方式2、本地时间戳3、ZK方式 4.uuid 5雪花算法
<property name="sequnceHandlerType">0</property>
使用本地方式作为数据库自增: 需设置 sequence_conf.properties配置文件
SCHEMATABLE.HISIDS= SCHEMATABLE.MINID=1001 SCHEMATABLE.MAXID=100000000 最大值 SCHEMATABLE.CURID=1000 当前数据库的索引值
<property name="sequnceHandlerType">1</property>
使用的是本地数据库的方式,需要在一个分节点创建表和存储过程,其中MYCAT_SEQUENCE必须为大写
>CREATE TABLE MYCAT_SEQUENCE ( `name` VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, remark varchar(100), -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护 PRIMARY KEY(name)) ENGINE=InnoDB; <br>-- – 获取当前sequence的值(返回当前值,增量) DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval ; END ;; DELIMITER ; -- 设置sequence值 DROP FUNCTION IF EXISTS `mycat_seq_nextval`; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;; DELIMITER ; -- 获取下一个sequence值 DROP FUNCTION IF EXISTS `mycat_seq_setval`; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END ;;
配置sequence_db_conf.properties ,加入Schemazhon中的table
<property name="sequnceHandlerType">2</property>
自动生成64为的时间戳,故设计主键是,要考虑其长度
日志:
1、wrapper.log2、mycat.log
以上是关于分库分表带来的问题及解决方案的主要内容,如果未能解决你的问题,请参考以下文章