Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql数据库优化(三)--分区

mysql数据库优化(三)--分区

作者头像
用户1558882
发布于 2018-10-15 04:42:25
发布于 2018-10-15 04:42:25
1.3K00
代码可运行
举报
文章被收录于专栏:RgcRgc
运行总次数:0
代码可运行

mysql的分区,分表

分区:把一个数据表的文件和索引分散存储在不同的物理文件中。 特点:业务层透明,无需任何修改,即使从新分表,也是在mysql层进行更改(业务层代码不动)

分表:把原来的表根据条件分成多个表,如原来的表为 user;现在分成2个小表 user_1,user_2;  特点:业务层需要修改代码。如过业务改变,可能需要从新分表,导致维护困难

当数据量达到一定级别后,需要通过 分区或分表来提高用户体验

如下知识点 为 分区

如:现在生产环境有用户表 account_user,对其按照 日期(每季度)进行分区。

表结构如下:

输入命令:show create table account_user;

由于此表有 主键和unique键,在分区时,必须要求被用来匹配分区的字段被包含在 主键,和unique键中(也就是复合主键和复合unique键);

通过如下命令进行操作把 create_time分别放在主键和unique键中(这时mobile字段不能保证唯一性,这是个大问题,需要解决)

添加unique键: ALTER TABLE account_user ADD UNIQUE KEY (mobile,create_time);

删除unique键: ALTER TABLE account_user DROP UNIQUE KEY ;

添加主键:ALTER TABLE account_user ADD PRIMARY KEY (id,create_time);

删除主键:ALTER TABLE account_user DROP PRIMARY KEY;

然后根据官网教程:

如下根据range分区进行添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE account_user PARTITION BY RANGE (TO_DAYS(create_time))
(
PARTITION account_user_2018_01 VALUES less than (TO_DAYS('2018-01-01')),
PARTITION account_user_2018_04 VALUES less than (TO_DAYS('2018-04-01')),
PARTITION account_user_2018_07 VALUES less than (TO_DAYS('2018-07-01')),
PARTITION account_user_2018_10 VALUES less than (TO_DAYS('2018-10-01')),
PARTITION account_user_2018_more VALUES less than MAXVALUE
)

然后查看 结果:

验证分区效果:

优点:根据create_time进行范围查询,会使用分区,避免全表扫描

使用分区的情况下:

只是查询了 3351行,或者说是查询了 (account_user_2018_01,account_user_2018_04,account_user_2018_07)三个分区

在没有分区的情况下:

发现进行全表扫描,行数为46808行

相关操作:

查看行数据所在分区:SELECT * FROM account_user PARTITION (account_user_2018_07) WHERE id=1; 

增加分区: ALTER TABLE account_user ADD PARTITION (PARTITION account_user_2019_01  VALUES LESS THAN  (TO_DAYS('2019-01-01')));    如果对应range分区有  MAXVALUE ,要先删除,否则报错

删除分区: ALTER TABLE account_user  DROP PARTITION account_user_2019_01; 

删除分区数据:ALTER TABLE account_user TRUNCATE PARTITION account_user_2019_01,account_user_2019_04;  

rebuild重建分区:ALTER TABLE account_user  REBUILD PARTITION account_user_2019_01;   #相当于drop所有记录,然后再reinsert;可以解决磁盘碎片  

优化分区:ALTER TABLE account_user  OPTIMIZE PARTITION account_user_2019_01;   #在删除数据后回收空间和碎片整理

analzye分区:ALTER TABLE account_user  ANALZYE PARTITION account_user_2019_01; 

check分区:ALTER TABLE account_user  CHECK PARTITION account_user_2019_01; 

所有分区方式:

list: 每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值. 将要匹配的任何值都必须在值列表中找到。

如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE account_user PARTITION BY LIST (TO_DAYS(create_time))
(
PARTITION account_user_2018_01 VALUES IN (TO_DAYS('2018-01-01'),TO_DAYS('2018-01-02')),
PARTITION account_user_2018_04 VALUES IN (TO_DAYS('2018-01-03'),TO_DAYS('2018-01-04'))
)

range:每个分区包含那些分区表达式的值位于一个给定的连续区间内的行

如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE account_user PARTITION BY RANGE (TO_DAYS(create_time))
(
PARTITION account_user_2018_01 VALUES less than (TO_DAYS('2018-01-01')),
PARTITION account_user_2018_04 VALUES less than (TO_DAYS('2018-04-01')),
PARTITION account_user_2018_07 VALUES less than (TO_DAYS('2018-07-01')),
PARTITION account_user_2018_10 VALUES less than (TO_DAYS('2018-10-01')),
PARTITION account_user_2018_more VALUES less than MAXVALUE
)

在使用 范围查询 create_time 时,会使用分区进行查询(时间复杂度:O(log N)),所有速度比没有使用分区(时间复杂度:O(N))的快。

hash:无需定义分区的条件,数据会平均分配到每个分区。只需要指明分区数即可。

如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE account_user PARTITION BY HASH(TO_DAYS(create_time))
PARTITIONS 5

LINEAR HASH分区:在数据量大的场景,譬如TB级,增加、删除、合并和拆分分区会更快,缺点是,相对于HASH分区,它数据分布不均匀的概率更大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE account_user PARTITION BY LINEAR HASH(TO_DAYS(create_time))
PARTITIONS 5

key分区:

1. KEY分区允许多列,而HASH分区只允许一列。

2. 如果在有主键或者唯一键的情况下,key中分区列可不指定,默认为主键或者唯一键,如果没有,则必须显性指定列。

3. KEY分区对象必须为列,而不能是基于列的表达式。

4. KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。

分区优点:

分区可以分在多个磁盘,存储更大一点

根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了

进行大数据搜索时可以进行并行处理。

跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

分区缺点:

其 分区对应的key必须包含主键或者unique键,导致 unique 键的字段失效(如用户注册表,手机号唯一性)

需要仔细考虑评估业务系统 对表 进行操作的侧重点,然后选择字段和分区方式进行分区,尽量平均分配数据到每个分区。分区后进行相关验证性测试 是否有效果 

案例:

1.公司通过推荐注册可以提现红包的方式拉取用户,造成 其他人利用接口恶意注册僵尸用户,导致用户表数据量过多,影响正常用户的使用。需求:活跃用户只有总用户的5%,如何提高活跃用户的体验?

方案:

1.在 用户表中增加一个 代表活跃度的字段,在用户每次活跃后,其值相应增加。通过 分区的方式(通过 活跃度 字段进行range分区),提高访问速度 。

           优点:无需系统层改变代码,活跃度改变后,会自动分区

2.在 用户表中增加一个 代表活跃度的字段,在用户每次活跃后,其值相应增加。通过分表的方式(根据 活跃度),

   缺点:需要系统层(应用程序)改变代码。

                      在用户活跃度变化后,需要手动的从一个表变到另一个表,导致需要定期维护,较为复杂

相关资料:

https://dev.mysql.com/doc/refman/5.6/en/alter-table-partition-operations.html?spm=a2c4e.11153940.blogcont75306.15.77d71d1cWRwCrI

 https://blog.csdn.net/yongchao940/article/details/55266603

https://www.cnblogs.com/phpshen/p/6198375.html

https://blog.csdn.net/kingcat666/article/details/78324678

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql学习总结08 — 优化(设计层)-索引与分区分表
普通索引:(index) 对关键字没有要求,如果一个索引在多个字段提取关键字,称为复合索引
CS逍遥剑仙
2018/10/09
2.1K0
mysql学习总结08 — 优化(设计层)-索引与分区分表
小弟问我:为什么MySQL不建议使用delete删除数据?
我负责的有几个系统随着业务量的增长,存储在MySQL中的数据日益剧增,我当时就想现在的业务方不讲武德,搞偷袭,趁我没反应过来把很多表,很快,很快啊都打到了亿级别,我大意了,没有闪,这就导致跟其Join的表的SQL变得很慢,对的应用接口的response time也变长了,影响了用户体验。
敖丙
2020/11/24
4.6K0
小弟问我:为什么MySQL不建议使用delete删除数据?
MySQL还能这样玩---第二篇之不为人知的分区
就访问数据库的应用程序而言,逻辑上只有一个表或者一个索引,但是实际上这个表可能由数十个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。
大忽悠爱学习
2022/05/10
5230
MySQL还能这样玩---第二篇之不为人知的分区
Mysql性能优化四:分库,分区,分表,你们如何做?
分库分区分表概念 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 。 分表 就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。表名可以按照某种业务hash进行映射。 分库 一旦分表,一个库中的表会越来越多。 下面来具体看看 分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三
友儿
2022/09/09
1K0
mysql 分区总结[通俗易懂]
数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。
全栈程序员站长
2022/09/01
2.6K0
MySQL时间类分区写SQL的一些注意事项
对于分区表的检索无非有两种,一种是带分区键,另一种则不带分区键。一般来讲检索条件带分区键则执行速度快,不带分区键则执行速度变慢。这种结论适应于大多数场景,但不能以偏概全,要针对不同的分区表定义来写最合适的SQL语句。用分区表的目的是为了减少SQL语句检索时的记录数,如果没有达到预期效果,则分区表只能带来副作用。
bisal
2022/03/02
1.3K0
用好 mysql 分区表
该文介绍了MySQL中表分区功能的使用,包括RANGE分区、LIST分区、HASH分区、KEY分区以及分区表的操作和优化。针对不同的分区类型,介绍了不同的应用场景和优缺点。同时,还提供了一些分区表SQL操作优化的建议。
潘昌伟
2017/09/01
10.7K0
用好 mysql 分区表
浅谈mysql分区、分表、分库
mysql支持的分区类型包括Range、List、Hash、Key,其中Range比较常用:
黄啊码
2021/09/26
1.6K0
MySQL分区表
在最近的项目中,我们需要保存大量的数据,而且这些数据是有有效期的,为了提供查询效率以及快速删除过期数据,我们选择了MySQL的分区机制。把数据按照时间进行分区。 分区类型 ---- Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。 List分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。 Hash分区:基于给定的分区个数,将
十毛
2019/04/01
5.2K0
MySQL分区表
MySQL · 最佳实践 · 分区表基本类型
随着MySQL越来越流行,Mysql里面的保存的数据也越来越大。在日常的工作中,我们经常遇到一张表里面保存了上亿甚至过十亿的记录。这些表里面保存了大量的历史记录。对于这些历史数据的清理是一个非常头疼事情,由于所有的数据都一个普通的表里。所以只能是启用一个或多个带where条件的delete语句去删除(一般where条件是时间)。这对数据库的造成了很大压力。即使我们把这些删除了,但底层的数据文件并没有变小。面对这类问题,最有效的方法就是在使用分区表。最常见的分区方法就是按照时间进行分区。分区一个最大的优点就是可以非常高效的进行历史数据的清理。
码农编程进阶笔记
2021/07/20
8780
Oracle分区表删除分区数据时导致索引失效解决
      今天有个小任务就是要删除些数据,哈哈,先自己小开心一下。因为要删除的数据表是我之前转换成的分区表。这个分区表是按照里面有个创建时间字段来分区的,1个季度为1个分区。所以我现在要将2017年7月1日之前的数据删除(数据量约1000万),可以直接删除表分区数据就好。如果要是用delete去删除这么多的数据,我还要写存储过程,分批提交的这样做。就是这样的一简单的truncate partition 引发了后继的业务故障。最终查询到该表的索引失效,重建立后恢复。真是汗! 二、实验
星哥玩云
2022/08/16
2.8K0
MySQL分区表姿势
分区的功能不是在存储引擎层实现的。因此不只是InnoDB才支持分区。MyISAM、NDB都支持分区操作。
保持热爱奔赴山海
2019/09/17
5.9K0
大型分布式业务平台数据库优化方法(上)
文章摘要:一个小小的MySQL数据库B-Tree索引可能会带来意想不到的性能优化提升……
用户2991389
2018/09/05
1K0
大型分布式业务平台数据库优化方法(上)
最佳实践 · MySQL 分区表实战指南
在数据量急剧增长的今天,传统的数据库管理方式可能无法有效处理海量数据的存储和查询需求。MySQL 提供了分区表功能,这不仅能够帮助优化性能,还能简化数据管理过程。分区表允许将数据表拆分成多个逻辑上的分区,每个分区可以在物理上存储于不同的存储介质上,从而提升查询效率和数据处理速度。本文将深入探讨 MySQL 中四种主要的分区类型——范围分区(RANGE)、列表分区(LIST)、哈希分区(HASH)以及键分区(KEY),并通过实际的案例分析和示例数据,帮助你掌握如何使用这些分区技术来优化数据库性能,提升数据处理能力。
不惑
2024/09/09
7470
最佳实践 · MySQL 分区表实战指南
腾讯TDSQL分区表介绍(1/2)
TDSQL集群支持创建集中式实例和分布式实例。在使用分布式实例的时候,可以创建以下几种类型的表:
胖五斤
2022/11/10
3.6K0
Mysql数据库优化
存储引擎:可以看作是数据表存储数据的一种格式,不同的格式具有的特性也各不相同。 举例说明:只有InnoDB存储引擎支持事务、外键、行级锁等特性,而MyISAM则支持压缩机制等特性。 存储引擎的特点:本身是MySQL数据库服务器的底层组件之一,最大的特点是采用“可插拔”的存储引擎架构。 “可插拔”的理解:指的是对正在运行的MySQL服务器依然可根据实际需求使用特定语句加载(插入,INSTALL PLUGIN语句)或卸载(拔出,UNINSTALL PLUGIN语句)所需的存储引擎文件。
海盗船长
2021/12/07
2.6K0
Mysql数据库优化
MogDB与PostgreSQL分区策略语法测试
PostgreSQL支持继承,版本10之前的分区表都是通过继承特性来实现,每个分区实际上都是一个独立的表。数据更新可通过触发器trigger或者规则rule来实现。
数据和云
2022/02/25
1.8K0
第38期:MySQL 时间类分区具体实现
适用分区或者说分表最多的场景依然是针对时间字段做拆分, 这节我们详细讲讲如何更好的基于时间字段来拆分。分别按照年、月、日几个维度的实现方法以及一些细节注意事项。
爱可生开源社区
2021/12/29
9430
mysql分区函数_mysql 分区可用函数
当然,还有FLOOR(),CEILING() 等,前提是使用这两个分区函数的分区健必须是整型。
全栈程序员站长
2022/06/27
6.5K0
Oracle 11g 分区表创建(自动按年、月、日分区)
前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。
星哥玩云
2022/08/17
3.7K0
Oracle 11g 分区表创建(自动按年、月、日分区)
相关推荐
mysql学习总结08 — 优化(设计层)-索引与分区分表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验