为什么阿里不推荐使用MySQL分区表?(下)

简介: 分区表:在示例表插入两条记录,按分区规则,记录分别落在p_2018和p_2019分区。 可见,该表包含了一个.frm文件和4个.ibd文件,每个分区对应一个.ibd文件: 对于引擎层,这是4个表 对于Server层,这是1个表

手动分表 V.S 分区表

比如,按年份划分,分别创建普通表t_2017t_2018t_2019等。手工分表也要找到需要更新的所有分表,然后依次执行更新。

性能上和分区表没有差别。

  • 分区表由server层决定使用哪个分区
  • 手动分表由应用层代码决定使用哪个分表

所以从引擎层看,也没啥区别。

两种方式的区别,主要在server层。server层的分区表一个严重问题就是打开表的行为。

分区策略

第一次访问一个分区表时,MySQL需要把所有分区都访问一遍。

一个典型的报错场景:若一个分区表的分区很多,比如超过1000,而MySQL启动时,open_files_limit参数默认值1024,则在访问该表时,由于需要打开所有文件,导致打开表文件的个数超过了上限而报错。

比如对一个包含很多分区的表,执行insert直接报错:

image.png

这条insert其实只需要访问一个分区,但语句报错了。这个表是MyISAM,如果使用InnoDB,不会出现该问题。


MyISAM分区表使用通用分区策略(generic partitioning),每次访问分区都由server层控制。通用分区策略,是MySQL一开始支持分区表的时候就存在的代码,在文件管理、表管理的实现上很粗糙,性能问题很严重。


MySQL 5.7.9开始,InnoDB引入本地分区策略(native partitioning),在InnoDB内部自己管理打开分区的行为。


MySQL 5.7.17开始,将MyISAM分区表标记为deprecated。

MySQL 8.0开始,已经禁止创建MyISAM分区表,只允许创建已经实现了本地分区策略的引擎。

image.png

目前只有InnoDB和NDB引擎支持本地分区策略。

分区表的server层行为

对于server层,一个分区表就只是一个表。

如图,分别是该例的操作序列和执行结果图。

  • 分区表的MDL锁
session_1 session_2
begin;
select * from tt
where ftime=‘2018-4-1’;


alter table tt truncate partition p_2017
(阻塞)

image.png

show processlist

image.png

虽然session2只需操作p_2107分区,但因为session1持有整个表tt的MDL锁,导致session2的alter语句被阻塞。

所以分区表在做DDL时,影响会更大。若使用的普通分表,则当你在truncate一个分表时,肯定不会跟另外一个分表上的查询语句,出现MDL锁冲突。


小结

在server层,认为这是同一张表,因此所有分区共用同一MDL锁

在引擎层,认为这是不同表,因此MDL锁之后的执行过程,会根据分区表规则,只访问必要的分区。

什么是必要的分区

根据SQL语句中的where条件,结合分区规则。比如上面的where ftime=‘2018-4-1’,根据分区规则year函数算出来的值是2018,那么就会落在p_2019分区。


但若这个where 条件改成 where ftime>='2018-4-1',虽然查询结果相同,但这时根据where条件,就要访问p_2019和p_others俩分区。


若查询语句的where条件没有分区key,就只能访问所有分区了。当然,这并非分区表的问题。即使是使用业务分表,where条件中没有使用分表的key,也必须访问所有的分表。

分区表的应用场景

一大优势是对业务透明,相对于用户分表来说,使用分区表的业务代码更简洁。还有,分区表可以很方便的清理历史数据。


如果一项业务跑的时间足够长,往往就会有根据时间删除历史数据的需求。这时按时间分区的分区表,就可直接通过alter table t drop partition …这个语法删掉分区,从而删掉过期的历史数据。


alter table t drop partition …是直接删除分区文件,跟drop普通表类似。与delete相比,优势是速度快、对系统影响小。


需要注意的是,我是以范围分区(range)为例和你介绍的。实际上,MySQL还支持hash分区、list分区等分区方法。

实际使用时,分区表跟用户分表,有两个问题:


第一次访问时,需要访问所有分区

共用MDL锁

因此,如果要使用分区表,就不要创建太多分区。我见过一个用户做了按天分区策略,然后预先创建了10年的分区。这种情况下,访问分区表的性能自然是不好的。这里有两个问题:


分区并不是越细越好

单表或单分区的数据一千万行,只要没有特别大的索引,对于现在的硬件能力来说都已是小表

分区不要提前预留太多,在使用之前预先创建即可

比如,如果是按月分区,每年年底时再把下一年度的12个新分区创建上即可。对于没有数据的历史分区,及时drop


分区表的其他问题,比如查询需要跨多个分区取数据,查询性能就会比较慢,基本上就不是分区表本身的问题,而是数据量或说使用方式问题。

如果你的团队已经维护了成熟的分库分表中间件,用业务分表,对业务开发同学没有额外的复杂性,对DBA也更直观,自然更好。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
存储 关系型数据库 MySQL
MySQL 分区表
MySQL 分区表
417 4
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
2224 0
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL场景评测:阿里云数据库服务的新高度
随着企业数字化转型的加速,对数据库的稳定性和性能提出了更高要求。阿里云的PolarDB MySQL应运而生,作为一款高度兼容MySQL协议的云原生数据库,它在性能、扩展性和安全性方面展现出了卓越的能力。本文将基于阿里云PolarDB MySQL的官方评测,深入探讨其在实际应用场景中的表现,以及为用户带来的价值。
558 0
|
存储 关系型数据库 数据库
MySQL设计规约问题之是否可以使用分区表
MySQL设计规约问题之是否可以使用分区表
|
存储 监控 关系型数据库
MySQL普通表转换为分区表实战指南
MySQL普通表转换为分区表实战指南
|
存储 关系型数据库 MySQL
MySQL分区表:万字详解与实践指南
MySQL分区表:万字详解与实践指南
|
存储 关系型数据库 MySQL
【MySQL技术内幕】4.8-分区表
【MySQL技术内幕】4.8-分区表
756 0

推荐镜像

更多