位置: 编程技术 - 正文

MySQL分区表的局限和限制详解(mysql5.7分区表)

编辑:rootadmin

推荐整理分享MySQL分区表的局限和限制详解(mysql5.7分区表),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql 表分区,mysql表分区语句,mysql分区和分表优缺点,mysql分区表是什么意思,mysql表分区语句,mysql分区和分表优缺点,mysql分区表的坑,mysql表分区语句,内容如对您有帮助,希望把文章链接给更多的朋友!

禁止构建

分区表达式不支持以下几种构建:

存储过程,存储函数,UDFS或者插件

声明变量或者用户变量

可以参考分区不支持的SQL函数

算术和逻辑运算符

分区表达式支持+,-,*算术运算,但是不支持DIV和/运算(还存在,可以查看Bug #, Bug #)。但是,结果必须是整形或者NULL(线性分区键除外,想了解更多信息,可以查看分区类型)。

分区表达式不支持位运算:|,&,^,<<,>>,~ .

HANDLER语句

在MySQL 5.7.1之前的分区表不支持HANDLER语句,以后的版本取消了这一限制。

服务器SQL模式

如果要用用户自定义分区的表的话,需要注意的是,在创建分区表时的SQL模式是不保留的。在服务器SQL模式一章中已经讨论过,大多数MySQL函数和运算符的结果可能会根据服务器SQL模式而改变。所以,一旦SQL模式在创建分区表后改变,可能导致这些表的行为发生重大变化,很容易导致数据丢失或者损坏。基于以上原因,强烈建议你在创建分区表后千万不要修改服务器的SQL模式。

举个例子来说明下上述情况:

1.错误处理

MySQL默认除以0的结果是NULL,而不是报错:

然而如果我们修改SQL模式的话,就会报错:

2.表辅助功能

有时候修改SQL模式可能会导致分区表不可用。比如有些表只有在SQL模式为NO_UNSIGNED_SUBTRACTION才发挥作用,比如:

如果你在创建tu后,修改SQL模式,就可能再也不能访问这个表了:

服务器端的SQL模式也会影响分区表的复制。在主备间使用不同的SQL模式可能会导致分区表达式主备上执行是不同的结果(而在阿里主备切换是很正常的操作);这也会导致在主备复制过程中,不同分区间的数据分布不同;也有可能导致在主库上的分区表insert成功,而备库上失败。基于上述情况,最好的解决办法是保证主备间的SQL模式要保持一致(这个是DBA在运维过程中需要注意的)。

性能注意事项

下面是一些会影响分区操作性能的因素:

文件系统操作分区或者重新分区(比如ALTER TABLE ...PARTITION BY ..., REORGANIZE PARTITION, 或者REMOVE PARTITIONING )操作取决于文件系统的实现。意思是说上述操作会受操作系统上,比如:文件系统的类型和特性,磁盘速度,swap空间,操作系统上的文件处理效率,以及MySQL服务器上的和文件句柄相关的选项,变量等因素影响。需要特别说明的是,你需要保证large_files_support是enabled的,open_files_limit设置是合理的。对于MyISAM引擎的分区表来说,需要增加myisam_max_sort_file_size以提高性能;对于InnoDB表来说,分区或者重新分区操作通过enabled innodb_file_per_table效率会更快。

也可以参考分区的最大数量。

MyISAM和分区文件描述符

对于MyISAM分区表来说,MySQL为每个打开的表,每个分区使用两个文件描述符。这也就意味着,在MyISAM分区表上想执行操作(特别是ALTER TABLE操作)比相同的表没有分区,需要更多的文件描述符。

假设我们要创建有个分区的MyISAM表,语句如下:

简单来讲,在这个例子中,虽然我们用的KEY分区,但是文件描述符的问题,在所有使用表引擎是MyISAM的分区里都会遇到,不管是分区类型是哪种。但是使用其他存储引擎(比如InnoDB)的分区表没有这个问题。

假设你想对t重新分区,想让它有个分区的话,使用下面的语句:

ALTER TABLE t PARTITION BY KEY (c1) PARTITIONS ;

如果要处理ALTER TABLE语句需要个文件描述符,原来个分区*2个+个新分区*2。这是因为在重新组织表数据时,必须打开所有的(新旧)分区。所以建议在执行这些操作时,要确保--open-files-limit要设置的大些。

表锁

对表执行分区操作的进程会占用表的写锁,不影响读,例如在这些分区上的INSERT和UPDATE操作只有在分区操作完成后才能执行。

存储引擎

分区操作,比如查询,和更新操作通常情况下用MyISAM引擎要比InnoDB和NDB快。

索引;分区修剪

分区表和非分区表一样,合理的利用索引可以显著地提升查询速度。另外,设计分区表以及在这些表上的查询,可以利用分区修剪来显著提升性能。

在MySQL 5.7.3版本之前,分区表不支持索引条件下推,之后的版本可以支持了。

load data性能

在MySQL 5.7,load data 使用buffer提高性能。你需要知道的是buffer会占用每个分区的KB来达到这个目的。

分区的最大个数

如果不是用NDB作为存储引擎的分区表,支持分区(这里子分区也包含在内)最大个数是。

如果使用NDB作为存储引擎的用户自定义分区的最大分区个数,取决于MySQL Cluster的版本, 数据节点和其他因素。

如果你创建一个非常多(比最大分区数要少)的分区时,遇到诸如Got error ... from storage engine: Out of resources when opening file类的错误,你可能需要增加open_files_limit。但是open_files_limit其实也依赖操作系统,可能不是所有的平台都可以建议调整。还有一些其他情况,不建议使用巨大或者成百上千个分区,所以使用越来越多的分区并不见得能带来好结果。

不支持Query cache

MySQL分区表的局限和限制详解(mysql5.7分区表)

分区表不支持query cache,在分区表的查询中自动避开了query cache。也就是说在分区表的查询语句中query cache是不起作用的。

每个分区一个key caches

在MySQL 5.7版本中,可以通过CACHE INDEX和LOAD INDEX INTO CACHE来使用MyISAM分区表的key cache。可以为一个,几个或者所有分区都定义key cache,这样可以把一个,几个或者所有分区的索引预加载到key cache中。

不支持InnoDB分区表的外键

使用InnoDB引擎的分区表不支持外键。下面的两种具体情况来阐述:

在InnoDB表不能使用包含有外键的自定义分区;如果已经使用了外键的InnoDB表,则不能被分区。

InnoDB表不能包含一个和用户自定义分区表相关的外键;使用了用户自定义分区的InnoDB表,不能包含和外键相关的列。

刚刚列出的限制的范围包括使用InnoDB存储引擎的所有表。违反这些限制的CREATE TABLE和ALTER TABLE语句是不被允许的。

ALTER TABLE ... ORDER BY

如果在分区表上执行ALTER TABLE ... ORDER BY的话,会导致每个分区的行排序。

REPLACE语句在修改primary key上的效率

在某些情况下是需要修改表的primary key的,如果你的应用程序使用了REPLACE语句,这些语句的结果可能会被大幅度修改。

全文索引

分区表不支持全文索引或者搜索,即使分区表的存储引擎是InnoDB或者MyISAM也不行。

空间列

分区表不支持空间列,比如点或者几何。

临时表

不能对临时表进行分区(Bug #)。

日志表

不能对日志表进行分区,如果强制执行ALTER TABLE ... PARTITION BY ... 语句会报错。

分区键的数据类型

分区键必须是整形或者结果是整形的表达式。不能用结果为ENUM类型的表达式。因为这种类型的表达式可能是NULL。

下面两种情况是例外的:

当用LINER分区时,可以使用除TEXT或者BLOBS以外的数据类型作为分区键,因为MySQL内部的 hash函数会从这些列中产生正确的数据类型。例如,下面的创建语句是合法的:

当用RANGE,LIST,DATE或者DATETIME列分区的话,可能会用string。例如,下面的创建语句是合法的:

上述异常都不适用于BLOB或TEXT列类型。

子查询

即使子查询避开整形值或者NULL值,分区键不能子查询。

子分区的问题

子分区必须使用HASH或者KEY分区。只有RANGE和LIST分区支持被子分区;HASH和KEY不支持被子分区。

SUBPARTITION BY KEY要求显示指定子分区列,不像PARTITION BY KEY可以省略(这种情况下会默认使用表的primary key)。例如,如果是这样创建表:

你也可以使用相同的列的创建分区表(以KEY分区),使用下面语句:

前面的语句其实和下面的语句是一样的:

但是,如果尝试使用缺省列作为子分区列,创建子分区表的话,以下语句将失败,必须指定该语句才能执行成功,如下所示:(bug已知 Bug #)。

数据字典和索引字典选项

分区表的数据字典和索引字典受以下因素制约:

表级的数据字典和索引字典被忽略(Bug #)

在Windows系统上,MyISAM分区表不支持独立分区或子分区的数据字典和索引字典选项。但是支持InnoDB分区表的独立分区或者子分区的数据字典。

修复和重建分区表

分区表支持CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE, 和 REPAIR TABLE语句。

另外,你也可以用ALTER TABLE ... REBUILD PARTITION在一个分区表上重建一个或多个分区;用ALTER TABLE ... REORGANIZE PARTITION同样可以重建分区。

从MySQL 5.7.2开始,子分区支持ANALYZE, CHECK, OPTIMIZE, REPAIR, 和 TRUNCATE操作。而在MySQL5.7.5之前的版本就已经引入REBUILD语法,只是不起作用(可以参考Bug #, Bug #)。

分区表不支持mysqlcheck, myisamchk, 和 myisampack操作。

导出选项

在MySQL 5.7.4以前的版本,不支持InnoDB分区表的FLUSH TABLES语句的导出选项(Bug #)。

参考资料

MySQL优化之InnoDB优化 学习计划很容易就被打断,坚持也不容易。最近公司里开会,要调整业务方向,建议学习NodeJS。NodeJS之前我就会一点,但是没有深入研究。Node的语法和

MySQL优化之缓存优化 高兴的是有博友mark了我的文章。我知道mark之后,很少会再来继续关注的。但是从侧面说明了在博友点开博客的同时,他感觉这篇博客是有价值的,是能

MySQL优化之连接优化 上文MySQL优化之缓存优化这篇文章中提到了一个很重要的概念,就是showvariables是用来表示系统编译或者配置在my.cnf中的变量值。而showstatus则称之为状态

标签: mysql5.7分区表

本文链接地址:https://www.jiuchutong.com/biancheng/350085.html 转载请保留说明!

上一篇:Mac下忘记Mysql的root用户密码的解决方法(macmysql忘记密码如何配置)

下一篇:MAC版修改MySQL初始密码的方法(macos mysql)

  • 小规模纳税人公户的钱怎么转出来
  • 增值税发票丢失最新处理办法
  • 配件销售过程中有什么注意事项
  • 交车辆保险的车能买吗
  • 飞机票抵扣进项税怎么计算民航发展基金
  • 不征税发票需要预缴税款吗
  • 母子公司间借款利息交税吗
  • 会计凭证整理的要求有哪些
  • 应收票据和应收账款的区别举例
  • 五险一金可以在手机上交吗
  • 小规模纳税人可以开数电专票吗
  • 汇算清缴之后报销去年的票如何分录?
  • 材料的销售成本计算公式
  • 增值税普通发票和专用发票有什么区别
  • 燃气在建工程要怎么转固定资产呢?
  • 出口退税进项抵扣了不退税可以吗
  • 怎么分清楚待认识的人
  • 预缴税款后怎么开票
  • 注销企业时所有权怎么办
  • 公司一般根据什么裁员
  • 公司购买的一次性纸杯计入哪个科目
  • 发生工伤事故先怎么办
  • 同期比较百分比如何计算
  • 采购发票主要包括什么可以根据什么单据流转生成
  • 汇算清缴发现以前预缴报表资产错误
  • 应收账款的账面余额公式
  • 鸿蒙系统怎么切换回安卓
  • scanregistry.exe - scanregistry是什么进程 有什么用
  • 上年度的发票还能红冲吗
  • 单位租房的房租怎么入账
  • 代开专票计提附加税吗
  • 车辆购置税可以代缴吗
  • 华为p50e手机价格及参数
  • 老板和公司账务处理流程
  • php5.4+mysql
  • register.exe - register进程有什么用.是什么意思
  • win10系统损坏开不了机
  • hhupd.exe
  • 前期差错更正怎么理解
  • PHP:pg_query()的用法_PostgreSQL函数
  • 未分配利润进行利润分配分录
  • keyemain.exe是什么
  • 代开发票要带什么资料去税务局办理?
  • 无形资产转让的会计处理
  • 银装素裹的意思和造句
  • Yii CDBCriteria常用方法实例小结
  • Cookie 的 SameSite 属性
  • at命令每天任务
  • 设备折旧费怎么使用
  • wordpress提示插件
  • mongodb4.4.2安装教程
  • mysql存储过程 游标
  • 直播属于什么行业门类
  • 商业承兑贴现几个点
  • 核定征收企业所得税的小型微利企业不得享受优惠政策
  • 股东分红是否必须由公司代扣
  • 扣税8%
  • 商品互换定义
  • 安全基金提取会计分录
  • 赠送的商品如何开发票
  • 成本发票未到如何结转成本
  • 如何做好工程后期维保
  • 待抵扣税额转入进项税额的分录
  • 营业账簿印花税怎么申报
  • Linux系统怎么调整屏幕亮度
  • windows一体机
  • ubuntu系统安装nvidia显卡驱动
  • ubuntu14升级
  • win7系统按Ctrl+Shift不能切换输入法的图文教程
  • linux在哪里操作
  • win8.1安装包
  • 左手linux+gdb,右手unity+vs,一个bit一个bit地去调试是种什么体验
  • 如何调试自己的情绪
  • jquery制作下拉菜单
  • js如何截取中文字符
  • javascript中字符串
  • scrollview嵌套flatlist
  • 厂房每年要交什么费用
  • 接受虚开转出滞纳金
  • 如何落实请示汇报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设