分区表历史

1、MySQL 5.1版本开始支持基于整数列的分区表,
2、MySQL 5.5版本开始支持RANGE和LIST分区,支持TRUNCATE分区,新增COLUMNS关键词简化分区定义。
3、MySQL 5.6版本开始支持分区交换,支持显式分区查询,支持最大8182个分区或子分区。
4、MySQL 5.7版本引入本地分区策略,并标记弃用通用分区策略。

分区策略

按照管理打开分区的行为可以将分区策略分为两类:
1、通用分区策略(Generic Partitioning), 由MySQL Server层负责控制访问分区。
2、本地分区策略(Native Partitioning),由存储引擎层负责控制访问分区。 在MySQL开始支持分区表时,将分区表访问控制操作放在MySQL Server层实现,由于在文件管理/表管理等方面实现较为粗糙,存在严重性能问题。而不同存储引擎层使用不同存储机制/索引结构/访问控制(锁),可以通过特殊设计来提升或优化特定的操作,将分区访问控制策略放置在存储引擎中实现更好。 通用分区策略问题:
1、当分区表第一次被访问时,无论该次访问需要操作多少个分区,都需要访问该分区表上所有分区,导致性能问题。当分区表上分区数量较大时,可能会因为打开文件数量超过参数open_file_limit限制而出错。
2、在对分区表进行维护时,需要同时维护原分区文件和新分区文件,如将分区表由100分区扩展至101分区时,需要2*100+2*101=402个文件描述符。 在MySQL 5.7.9版本中,InnoDB引入本地分区策略,由InnoDB存储引擎层内部管理访问分区表行为。
在MySQL 5.7.17版本中,MySQL将通用分区策略标记为弃用
在MySQL 8.0版本,不再允许MyISAM引擎使用分区表,因为MyISAM引擎不支持本地分区策略。
目前仅有InnoDB和NDB两种存储引擎支持本地分区策略。

MySQL 5.7分区增强

MySQL 5.7分区增强:
1、MySQL 5.7.1开始支持HANDLER语句(非标准SQL语句,不支持DML操作,通过指定索引来访问数据,降低优化器解析和优化SQL的开销,提升查询性能。)
2、MySQL 5.7.2开始子分区支持ANALYZE/CHECK/OPTIMIZE/REPAIR/TRUNCATE操作
3、MySQL5.7.3支持index condition pushdown(ICP)特性
4、MySQL 5.7.4为InnoDB表分区支持FLUSH TABLES FOR EXPORT选项
5、支持使用缓存来提升Load data的性能,每个分区使用130KB缓冲区
6、支持使用CACHE INDEX和LOAD INDEX INTO CACHE语句对分区的MyISAM表支持索引缓存

分区表优点

在MySQL Server层分区表为一个表,而在MySQL存储引擎层分区表是多个表,因此有如下特点:
1、分区表对业务透明,只需要维护一个表的数据结构。
2、DML操作加锁仅影响操作的分区,不会影响未访问分区。
3、通过分区交换快速将数据换入和换出分区表。
4、通过TRUNCATE操作快速清理特定分区数据。
5、通过强制分区仅访问特定分区数据,减少操作影响。
6、通过大数据量分区能有效降低索引层数,提高查询性能。

分区表缺点

由于分区表在MySQL Server层为一个表,因此:
1、DDL操作需要锁定所有分区,导致所有分区上操作都被阻塞。
2、当表数据量较小时,分区表和非分区表性能相近,分区表效果有限。
3、当表数据量较大时,对分区表进行DDL或其他运维操作难度大风险高。
4、分区表使用较少,存在未知风险多,BUG多BUG多BUG多,MySQL社区版本免费,横向扩展成本低,分库分表实现简单且中间件完善。
5、当单台服务器性能无法满足时,对分区表进行分拆的成本较高,而分库分表能很容易实现横向分拆。
6、当分区表操作不当导致访问所有分区时,会导致严重的性能问题,而分库分表操作不当仅影响访问的表。
7、使用分库分表可以有效运维降低运维操作影响,对1亿数据量表做DDL操作需要谨慎评估,而对10万数据量表做DDL操作可以默认其很快完成。
8、使用分库分表可以有效减小宕机或其他故障影响,将数据分库分表到10套群集上,一套群集发生故障仅影响业务的一成。

个人见解

对于SQL Server和Oracle这些商业数据库,由于商业授权导致横向扩展成本较高,且分区表功能稳定,因此通过硬件扩展和分区来承担大数据量带来的负载,而对于MySQL,互联网企业有资源有能力将很多需求迁移到数据库外部实现,因此更追求MySQL使用过程中的简单稳定可靠,且通过堆服务器+分库分表更能有处理数据量爆炸式增长带来的性能问题。

MySQL Partition Table--分区表优缺点的更多相关文章

  1. oracle partition table 分区表详解

    Oracle partition table 分区表详解 分区表就是通过使用分区技术,将一张大表,拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性.分区表中,每个分 ...

  2. Mycat+Mysql 插入数据报错 i[Err] 1064 - partition table, insert must provide ColumnList

    使用Navicat连接Mycat 8066 成功插入了分库表和全局表 1.全局表 sql如下: '); '); '); 插入成功! 2.分库表 sql如下: ', null, null, null, ...

  3. SQL Server 查看分区表(partition table)的分区范围(partition range)

    https://www.cnblogs.com/chuncn/archive/2009/02/20/1395165.html SQL Server 2005 的分区表(partition table) ...

  4. Mysql Partition 理论知识总结

    简述: 本文内容主要 Giuseppe Maxia 曾在Mysql Conference & Expo 2010发表关于 <Mysql Partition in Mysql 5.1 &a ...

  5. mysql Partition(分区)初探

    mysql Partition(分区)初探   表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分.  mysql是具有MERG ...

  6. MySQL partition分区I

    http://blog.csdn.net/binger819623/article/details/5280267 一.        分区的概念二.        为什么使用分区?(优点)三.    ...

  7. mysql partition分区

    (转) 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水 ...

  8. MySQL · 最佳实践 · 分区表基本类型

    MySQL · 最佳实践 · 分区表基本类型 MySQL分区表概述 随着MySQL越来越流行,Mysql里面的保存的数据也越来越大.在日常的工作中,我们经常遇到一张表里面保存了上亿甚至过十亿的记录.这 ...

  9. MYSQL之水平分区----MySQL partition分区I(5.1)

    一.        分区的概念 二.        为什么使用分区?(优点) 三.        分区类型 四.        子分区 五.        对分区进行修改(增加.删除.分解.合并) 六 ...

随机推荐

  1. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表.条型图表.金融图表和其它图表. 线型图表 ...

  2. mysql 某表某列支持 emoji

    ALTER TABLE `customer_user` MODIFY COLUMN `UserName`  varchar(30) CHARACTER SET utf8mb4 COLLATE utf8 ...

  3. 安卓 android studio 报错 The specified Android SDK Build Tools version (27.0.3) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle

    今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 报错截图: 大致意思,目前使用的build工具版本27.0.3不合适.因为当前使用Gradle插件版本是3.2.1,这个版 ...

  4. js的style.width取不到元素的宽度值

    使用jquery的.width()方法获取一个元素的当前宽度,不管元素是否设置了宽度,css样式时内联 外联或者是内嵌,都可以使用 这个方法获取元素的宽度. 使用原生js style.width .w ...

  5. [LeetCode] 232. Implement Queue using Stacks 用栈来实现队列

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  6. SQL查询无限层级结构的所有下级,所有上级(即所有的子孙曾孙等等)

     表名:tb_menu 内容如下: 查询ID为3的所有无限层下级会员 WITH TAS( SELECT * FROM tb_menu WHERE id=3 UNION ALL SELECT a.* F ...

  7. 【C/C++开发】C++编译指令#pragma pack的配对使用

    C++编译指令#pragma pack的配对使用 #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack ...

  8. 【转帖】处理器史话 | 服务器CPU市场的战役, AMD、Intel和ARM的厮杀

    处理器史话 | 服务器CPU市场的战役, AMD.Intel和ARM的厮杀 https://www.eefocus.com/mcu-dsp/377300   说完了个性鲜明的消费类电子,接下来聊一聊通 ...

  9. poj 3744 题解

    题目 题意: $ yyf $ 一开始在 $ 1 $ 号节点他要通过一条有 $ n $ 个地雷的道路,每次前进他有 $ p $ 的概率前进一步,有 $ 1-p $ 的概率前进两步,问他不领盒饭的概率. ...

  10. 爬虫解析库beautifulsoup

    一.介绍 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库. #安装Beautiful Soup pip install beautifulsoup4 #安装解析 ...