热点
模块化思维实战:后端站长从0到1构建高效网站,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[从0到1:运用模块化思维与实战技巧,轻松构建高效网站]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以考虑:后端站长视角,强调模块化思维和实战技巧,从0到1构建高效网站可能的从0到1:后端站长教你模块化构建高效网站 但字数可能超?数一下:从0到1:后端站长教你模块化构建高效网站 —— 共18个字符(包括标点)?汉字每个算一个字,冒号、空格?严格来说:从0到1:后端站长教你模块化构建高效网站 共16个字(从0到1:后端站长教你模块化构建高效网站,数一下:从0到1:(3个汉字+1个冒号?不,是从0到1是4个字符,但通常算4个?我们按汉字+符号更好的:去掉一些词nn模块化思维实战:后端站长从0到1建高效站 数一下:模块化思维实战:后端站长从0到1建高效站 —— 共18个?模块化思维实战(6字)冒号(1)后端站长(4)从0到1(4)建高效站(4)总19?有点多nn更简洁:模块化构建高效网站:后端站长的从0到1 共14个字?模块化构建高效网站:后端站长的从0到1 —— 13个汉字+1冒号+1数字?其实从0到1是4个字符可以nn或者:后端站长:模块化思维从0到1打造高效网站 共16字?后端站长:模块化思维从0到1打造高效网站 —— 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)打(15)造(16)高(17)效(18)网(19)站(20) —— 20字,超了nn要控制在30字以内,所以20字以内都行但最好更精炼nn考虑直接用原话中的从0到1和模块化思维、实战技巧、高效网站但题目要求以后端站长口吻,所以可以加上后端站长nn思路:从0到1:后端站长的模块化实战,高效网站轻松建 数一下:从0到1:后端站长的模块化实战,高效网站轻松建 —— 从0到1(4)冒号(1)后端站长(4)的(1)模块化实战(5)逗号(1)高效网站(4)轻松建(3)总共4+1+4+1+5+1+4+3=23字可以nn更简洁:模块化思维实战:后端站长从0到1建高效站 前面数过19字nn或者:后端站长带你从0到1模块化构建高效网站 15字nn注意:要求与技术、科技相关,但标题本身已经涉及nn我会选择:后端站长:模块化思维从0到1轻松构建高效网站 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)轻(15)松(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字可以nn另一个:从0到1:后端站长模块化实战构建高效网站 22字左右nn为了更口语化:从0到1轻松建站:后端站长教你模块化实战 15字?从0到1轻松建站:后端站长教你模块化实战 —— 共18字?nn我最后决定用:从0到1:模块化+实战,后端站长教你轻松建高效站 数:从0到1:模块化+实战,后端站长教你轻松建高效站 —— 共?从(1)0(2)到(3)1(4):(5)模(6)块(7)化(8)+(9)实(10)战(11),(12)后(13)端(14)站(15)长(16)教(17)你(18)轻(19)松(20)建(21)高(22)效(23)站(24) —— 24字略长去掉教你变成从0到1:模块化+实战,后端站长轻松建高效站 22字nn或者直接:模块化思维实战:后端站长从0到1构建高效网站 18字?数一下:模(1)块(2)化(3)思(4)维(5)实(6)战(7):(8)后(9)端(10)站(11)长(12)从(13)0(14)到(15)1(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字还是22nn我认为22字完全在30字以内可以输出这个nn注意:不要加任何说明直接输出标题
16 9 月 2026, 周三

副标题#e#

实践背景

项目中有的表空间太大,且行数太多,故决定对一些表进行分库分表。再研究选型方案的时候发现常用的一些分库分表的解决方案对业务代码修改较多,故决定采用MySQL的分区方案。

其实在我个人看来,分区表就是MySQL帮我们实现了底层的分库分表,不需要涉及业务代码的修改,不需要关注分布式事务。因为就访问数据库而言,逻辑上还是只有一个表,但是实际上确有多个物理分区对象组成,会根据具体的分区规则查询具体的分区。

介绍一下这次实践的表,表空间大小172G,1亿2千万条记录。

数据库版本:RDS MySQL 5.6

工具:阿里云DTS

一、为什么分区?

 优点:

  •    对已过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据,它的效率远比DELETE高
  •    在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率

例如下面语句:

      SELECT * FROM t PARTITION(p0,p1)WHERE c <5 仅选择与WHERE条件匹配的分区p0和p1中的记录

  •    涉及聚合函数SUM()、COUNT()的查询时,会在每个分区上并行处理
  •    分区把原本一个表的数据存储在多个物理磁盘上,实现了更高的IOPS

缺点:

  •    无法使用外键,不支持全文索引(现在应该也没什么公司还在用外键吧)
  •    分区键设计不太灵活,如果不走分区键,很容易出现全表锁
  •   开发写一个SQL,不清楚mysql是怎么玩的

二、RANGE分区

目前MySQL支持范围分区(RANGE),列表分区(LIST),哈希分区(HASH)以及KEY分区四种。

本文是以范围分区(RANGE)对时间进行的分区的,故我就简单介绍一下RANGE分区。更多分区类型详见官方文档MySQL 5.6 分区类型

基于一个给定连续区间的列值,根据区间分配分区。最常见的是基于时间字段。其实基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。MySQL 5.6支持的分区函数

本例中使用TO_DAYS函数

  1. CREATE TABLE members (  
  2.     id VARCHAR(25) NOT NULL,  
  3.     firstname VARCHAR(25) NOT NULL,  
  4.     lastname VARCHAR(25) NOT NULL,  
  5.     username VARCHAR(16) NOT NULL,  
  6.     email VARCHAR(35),  
  7.     joindate DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',  
  8.     PRIMARY KEY (id,joindate) USING BTREE,  
  9.     KEY idx_joindate (joindate) USING BTREE  
  10. )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT  
  11. PARTITION BY RANGE (TO_DAYS(joindate)) (  
  12.     PARTITION p0 VALUES LESS THAN (TO_DAYS('1960-01-01')),  
  13.     PARTITION p1 VALUES LESS THAN (TO_DAYS('1970-01-01')),  
  14.     PARTITION p2 VALUES LESS THAN (TO_DAYS('1980-01-01')),  
  15.     PARTITION p3 VALUES LESS THAN (TO_DAYS('1990-01-01')),  
  16.     PARTITION p4 VALUES LESS THAN MAXVALUE  
  17. ); 

PS:像例子中的如果你有主键或唯一索引,你必须把你的分区键也加上,其中joindate就是分区键,要不创建会失败!

PS:像上面加了LESS THAN MAXVALUE,后面就不能新加分区了!!!

示例:

如下查询就会落在定义的p2分区内的索引上。故在查询的时候带上你的分区键就会走对应分区查询数据,如果你的条件跨越多个分区进行聚合函数SUM()、COUNT()的查询时,它会在每个分区上并行处理。如果没有带分区键查询就会全表查询。

  1. explain partitions select * from members WHERE joindate BETWEEN '1970-02-03' AND '1970-02-04'; 

MySQL--RDS下的分区表实践

我在迁移完数据进行查询的时候发现一个特别有意思的现象,同一条SQL如果分区键的时间区间不一样,它会根据rows行数少的走不同的范围索引。至于它底层是怎么实现的我就没去研究了

三、分区管理

简单介绍了下范围分区,接下来说一下对分区常用的一下操作。

分区管理包括对于分区的增加,删除,以及查询。更多详见官方文档MySQL 分区管理

1.增加分区

对于RANGE和LIST分区:

  1. alter table table_name add partition (partition p0 values ...(exp))  
  2. #例  
  3. ALTER TABLE members ADD PARTITION (TO_DAYS('2021-03-01')); 

2.删除分区

#p#副标题#e#

删除了分区,同时也将删除该分区中的所有数据。如果删除了分区导致分区不能覆盖所有值,那么插入数据的时候会报错。

  1. alter table table_name drop partition p0;  

3.查询有多少个分区

  1. SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'members'; 

MySQL--RDS下的分区表实践

四、数据迁移

前面说了那么多概念,我说一下本次把大表数据迁移到分区表的过程。

为什么会选择DTS呢?因为它可以不停机迁移数据,支持全量迁移和增量迁移,对原表影响不大。

迁移过程如下:

  1.    首先在RDS的同一个实例里面新建了一张同结构的分区表
  2.    使用DTS创建迁移任务,迁移时候不要选择结构钱谦益,只选择全量+增量迁移
  3.    然后还需要编辑下目标库表名,也就是做下映射从A->B的迁移
  4.    停掉写入数据的任务,当任务队列为空时,等待几分钟暂停并结束迁移任务
  5.    最后修改表名,完成数据迁移和切换(我在测试环境修改分区表名要一些时间,但RDS修改表名是秒改)

【编辑推荐】

  1. 详解MySQL数据库的Index Condition Pushdown(ICP)特性
  2. 超详细的MySQL数据库参数优化,都总结在这里了
  3. 优化体系 | 我是怎么计算MySQL数据库索引长度的?
  4. MariaDB:真正的实时同步数据库,MySQL要小心了
  5. 详解MySQL索引长度和区分度之间的平衡,值得收藏

【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

模块化思维实战:后端站长从0到1构建高效网站,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[从0到1:运用模块化思维与实战技巧,轻松构建高效网站]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以考虑:后端站长视角,强调模块化思维和实战技巧,从0到1构建高效网站可能的从0到1:后端站长教你模块化构建高效网站 但字数可能超?数一下:从0到1:后端站长教你模块化构建高效网站 —— 共18个字符(包括标点)?汉字每个算一个字,冒号、空格?严格来说:从0到1:后端站长教你模块化构建高效网站 共16个字(从0到1:后端站长教你模块化构建高效网站,数一下:从0到1:(3个汉字+1个冒号?不,是从0到1是4个字符,但通常算4个?我们按汉字+符号更好的:去掉一些词nn模块化思维实战:后端站长从0到1建高效站 数一下:模块化思维实战:后端站长从0到1建高效站 —— 共18个?模块化思维实战(6字)冒号(1)后端站长(4)从0到1(4)建高效站(4)总19?有点多nn更简洁:模块化构建高效网站:后端站长的从0到1 共14个字?模块化构建高效网站:后端站长的从0到1 —— 13个汉字+1冒号+1数字?其实从0到1是4个字符可以nn或者:后端站长:模块化思维从0到1打造高效网站 共16字?后端站长:模块化思维从0到1打造高效网站 —— 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)打(15)造(16)高(17)效(18)网(19)站(20) —— 20字,超了nn要控制在30字以内,所以20字以内都行但最好更精炼nn考虑直接用原话中的从0到1和模块化思维、实战技巧、高效网站但题目要求以后端站长口吻,所以可以加上后端站长nn思路:从0到1:后端站长的模块化实战,高效网站轻松建 数一下:从0到1:后端站长的模块化实战,高效网站轻松建 —— 从0到1(4)冒号(1)后端站长(4)的(1)模块化实战(5)逗号(1)高效网站(4)轻松建(3)总共4+1+4+1+5+1+4+3=23字可以nn更简洁:模块化思维实战:后端站长从0到1建高效站 前面数过19字nn或者:后端站长带你从0到1模块化构建高效网站 15字nn注意:要求与技术、科技相关,但标题本身已经涉及nn我会选择:后端站长:模块化思维从0到1轻松构建高效网站 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)轻(15)松(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字可以nn另一个:从0到1:后端站长模块化实战构建高效网站 22字左右nn为了更口语化:从0到1轻松建站:后端站长教你模块化实战 15字?从0到1轻松建站:后端站长教你模块化实战 —— 共18字?nn我最后决定用:从0到1:模块化+实战,后端站长教你轻松建高效站 数:从0到1:模块化+实战,后端站长教你轻松建高效站 —— 共?从(1)0(2)到(3)1(4):(5)模(6)块(7)化(8)+(9)实(10)战(11),(12)后(13)端(14)站(15)长(16)教(17)你(18)轻(19)松(20)建(21)高(22)效(23)站(24) —— 24字略长去掉教你变成从0到1:模块化+实战,后端站长轻松建高效站 22字nn或者直接:模块化思维实战:后端站长从0到1构建高效网站 18字?数一下:模(1)块(2)化(3)思(4)维(5)实(6)战(7):(8)后(9)端(10)站(11)长(12)从(13)0(14)到(15)1(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字还是22nn我认为22字完全在30字以内可以输出这个nn注意:不要加任何说明直接输出标题