ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分库分表带来的问题及解决方案

2022-01-22 22:32:42  阅读:166  来源: 互联网

标签:FUNCTION 分库 name seq 解决方案 value mycat 分表


一.理解分库分表的意义

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方式

<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

 

标签:FUNCTION,分库,name,seq,解决方案,value,mycat,分表
来源: https://www.cnblogs.com/tongcc/p/15835321.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有