在线DDL,分库分表分区

本文介绍了MySQL的在线DDL操作,包括inplace和copy两种方式,强调了对DDL风险的测试和管理。还详细讨论了分区表的概念,如范围分区、列表分区、哈希分区和子分区,以及它们的优缺点和管理操作。最后,提出了分库分表的解决方案,以应对高并发和大数据量的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

online ddl
ddl不是对某一个数据行进行操作,是对整个表进行操作,或者整个表的所有的行、列。
ddl往往意味着很多坑。坑往往是灾难性的。

  • 1.整个表的操作
  • 2.ddl往往意味着会短暂的加上 exclusive锁(排他锁)或shared锁
  • 3.产生海量的IO、长时间的锁

如何对ddl风险测试?

  • 1.要意识到这是一个ddl
  • 2.确认这个ddl是否会产生大量的IO。
  • 在测试系统里面,建立一张大表,执行ddl。观察时间、iostat。如果时间长、合并读或者合并写非常大,则说明产生了很大的ddl操作。

alter table t1 add column d6 varchar(10),algorithm in place,lock=none
#给表t1加一个列 

DDL的两种方式:

  • ①inplace方式:(建议)。在表上加列的时候,分裂出来,在原来的位置上操作,搁不下时,再加数据块。
  • ②copy方式:新建另一个表同时增加列,然后把原来所有的数据读出来,插入到新表。(意味着海量的io)

lock意味着:

  • ①lock=none表示对表不加锁。
  • ②shared 共享锁
  • ③exclusive 排他锁

online中lock=none并不是完全的none!在增量应用期间,也会产生shared或者exclusive锁!

mysql5.5以前,
shared:建索引会触发;
exclusive:添加列,删除列会触发;
即:

  • 5.5版本不支持online ddl!
  • 5.6版本开始支持在线dll;lock可以等于none
  • 5.7继续支持。

(注:oracle不支持在线ddl)
online ddl小结:

  • ①尽量in place
  • ②尽量lock=none
  • ③对于ddl期间产生海量io的ddl操作来说,即使支持online dll,生产期间尽量不要做!

开发经常会对表进行ddl,如何规范ddl操作,写出一个规范的流程。

  • ①提交ddl需求给DBA。限制开发人员对数据库的权限(grant)。
  • ②DBA测试:io测试、时间测试、是否支持in place和none,显式的加上lock none
  • ③DBA形成操作规范和风向评估报告,走流程审批。
  • ④进行相关的操作。

分区表
将一个大表分成多个分区,对一个分区进行ddl,便于管理。
分区表四大好处:

  • ①还是一个表名字,不影响SQL
  • ②每一个分区都有自己的名字,可以独立于各分区进行操作
  • ③便于数据的归档(把对应的分区置换出去)
  • ④提升性能

分区类型:范围分区、列表分区、哈希分区、key分区、子分区等
(一)范围分区

  • ①指定分区列;
  • ②指定分区范围;
  • ③分区范围是小于;
  • ④最好指定maxvalue列;
  • ⑤最长使用的列:数字、日期

例子1:以年和天分区的表,且带上maxvalue:

create table employeed (
id int not null,
fname varchar(30),
lname varchar(30),
hired date not null default '1970-01-01',
separated date not null default '9999-12-31',
job_code int,
store_id int
)
partition by range (year(separated))  (
parttion p0 values less than (19
### 分库分表相关面试问题与答案 #### 1. 什么是分库分表?为什么需要进行分库分表分库分表是一种数据库扩展技术,用于解决单库单表在高并发、大数据量场景下的性能瓶颈问题。垂直分库是按照业务和功能维度对数据进行拆分,将不同业务的数据分别存放到不同的数据库中[^1]。水平分库则是将同一个表的数据按照某种规则(如ID范围、哈希、时间等)拆分到多个不同的数据库中[^3]。通过分库分表可以有效降低单库的压力,提升系统性能和扩展性。 #### 2. 垂直分库和水平分库的区别是什么? 垂直分库按照业务类型对数据进行分离,剥离为多个数据库,例如订单、支付、会员等表分别存放在对应的订单库、支付库、会员库中。这种方式的核心理念是“专库专用”,能够缓解单库的压力,但无法解决单表数据量过大的问题。水平分库则是将同一张表的数据按照某种规则拆分到多个数据库中,每个数据库具有相同的表结构,但存储不同的数据子集。 #### 3. 分库分表后如何进行分页查询? 分库分表后进行分页查询需要考虑数据的分布情况。可以通过在各个分表中分别执行分页查询,然后将结果合并起来。另一种方法是在总表中进行分页查询,根据分表规则将查询结果路由到相应的分表中获取具体数据[^2]。需要注意的是,这种操作可能会带来额外的性能开销,因此需要合理设计分页逻辑。 #### 4. 数据库分片策略有哪些?如何选择合适的分片策略? 常见的分片策略包括: - **基于范围的分片**:按照某个字段的值范围进行分片,例如按用户ID范围划分。 - **基于哈希的分片**:通过对某个字段的值进行哈希运算,将数据分配到不同的分片中。 - **基于列表的分片**:根据某些固定值列表进行分片,例如按地区划分。 - **基于时间的分片**:按照时间维度进行分片,适用于日志或历史数据存储。 选择分片策略时需要综合考虑业务特点、数据访问模式以及潜在的热点问题。例如,为了避免数据热点问题,可以选择基于哈希的分片策略,确保数据均匀分布[^5]。 #### 5. 分库分表后如何处理跨库事务? 分库分表后,跨库事务的处理是一个复杂的问题。通常可以通过以下几种方式解决: - **分布式事务管理框架**:使用如Seata、TCC等分布式事务管理框架来保证跨库事务的一致性。 - **补偿机制**:通过实现补偿逻辑来处理事务失败的情况。 - **消息队列**:利用消息队列实现最终一致性,通过异步方式完成跨库操作。 #### 6. 分区和分表的区别是什么? 分区和分表虽然都用于分解表,但本质上有很大区别。分表是将大表分解为若干个独立的实体表,每个表都是独立的物理存在。而分区是将数据分段划分在多个位置存放,分区后表仍然是一张表,只是数据分散到不同的物理位置。此外,分区表对分区键有严格要求,并且在表变大后执行DDL、SHARDING、单表恢复等操作会变得更加困难[^4]。 #### 7. 数据库中间件在分库分表中的作用是什么? 数据库中间件是连接应用程序和数据库之间的桥梁,它可以提供数据访问、事务管理、数据安全等功能,使得应用程序可以更加高效、安全地访问数据库。不同的数据库中间件具有不同的特点和优势,例如Sharding-JDBC提供了分库分表、读写分离等功能,帮助开发者简化分布式数据库的开发和维护工作[^5]。 ```python # 示例代码:基于哈希的分片策略 def get_shard_id(user_id, total_shards): return user_id % total_shards user_id = 12345 total_shards = 10 shard_id = get_shard_id(user_id, total_shards) print(f"User ID {user_id} belongs to shard {shard_id}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯言甚善

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值