接着重命名将新表替换上去:
/*这是个颇为经典的语句哈*/
RENAME TABLE members TO members_bak,members_tmp TO members;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧 。经过这个操作,使得原先8G多的表 , 一下子变成了2G多 。
浅谈mysql数据库分库分表那些事-亿级数据存储方案mysql分库分表一般有如下场景
其中1,2相对较容易实现,本文重点讲讲水平拆表和水平拆库,以及基于mybatis插件方式实现水平拆分方案落地 。
在 《聊一聊扩展字段设计》一文中有讲解到基于KV水平存储扩展字段方案,这就是非常典型的可以水平分表的场景 。主表和kv表是一对N关系,随着主表数据量增长,KV表最大N倍线性增长 。
这里我们以分KV表水平拆分为场景
对于kv扩展字段查询,只会根据id + key 或者 id 为条件的方式查询,所以这里我们可以按照id 分片即可
分512张表(实际场景具体分多少表还得根据字段增加的频次而定)
分表后表名为kv_000~kv_511
id % 512 = 1 .... 分到 kv_001,
id % 512 = 2 .... 分到 kv_002
依次类推!
水平分表相对比较容易,后面会讲到基于mybatis插件实现方案
场景:以下我们基于博客文章表分库场景来分析
目标:
表结构如下(节选部分字段):
按照user_id sharding
假如分1024个库,按照user_id % 1024 hash
user_id % 1024 = 1分到db_001库
user_id % 1024 = 2 分到db_002库
依次类推
目前是2个节点,假如后期达到瓶颈,我们可以增加至4个节点
最多可以增加只1024个节点,性能线性增长
对于水平分表/分库后,非shardingKey查询首先得考虑到
基于mybatis分库分表,一般常用的一种是基于spring AOP方式, 另外一种基于mybatis插件 。其实两种方式思路差不多 。
为了比较直观解决这个问题,我分别在Executor 和StatementHandler阶段2个拦截器
实现动态数据源获取接口
测试结果如下
由此可知,我们需要在Executor阶段 切换数据源
对于分库:
原始sql:
目标sql:
其中定义了三个注解
@useMaster 是否强制读主
@shardingBy 分片标识
@DB 定义逻辑表名 库名以及分片策略
1)编写entity
Insert
select
以上顺利实现mysql分库,同样的道理实现同时分库分表也很容易实现 。
此插件具体实现方案已开源:
【mysql怎么做分表分库 mysql分表的方法】 目录如下:
mysql分库分表,首先得找到瓶颈在哪里(IO or CPU),是分库还是分表,分多少?不能为了分库分表而拆分 。
原则上是尽量先垂直拆分 后 水平拆分 。
以上基于mybatis插件分库分表是一种实现思路,还有很多不完善的地方,
例如:
如何实现mysql的分库分表1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果 。在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二 , sql的执行时间 。其实这二个是一回事,等待的同时 , 肯定有sql在执行 。所以我们要缩短sql的执行时间 。
mysql中有一种机制是表锁定和行锁定 , 为什么要出现这种机制,是为了保证数据的完整 性,我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?很显然mysql 对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎) 。表锁定表示你们都不能对这张表进行操作,必须等我对 表操作完才行 。行锁定也一样,别的sql必须等我对这条数据操作完了 , 才能对这条数据进行操作 。如果数据太多,一次执行的时间太长,等待的时间就越长 , 这 也是我们为什么要分表的原因 。
- mysql游标和存储过程是什么 mysql游标表名为变量
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
