参考答案
MySQL分区表的限制因素:
1. 禁止构建
分区表达式不支持以下几种构建:
- 存储过程,存储函数,UDFS或者插件。
- 声明变量或者用户变量。
2. 算术和逻辑运算符
分区表达式支持+,-,*算术运算,但是不支持DIV和/运算。
3. 服务器SQL模式
如果要用用户自定义分区的表,在创建分区表时的SQL模式是不保留的。
4. 文件系统操作
分区或者重新分区(比如ALTER TABLE …PARTITION BY ...
, REORGANIZE PARTITION
, 或者REMOVE PARTITIONING
)操作取决于文件系统的实现。
5. 分区的最大个数
如果不是用NDB作为存储引擎的分区表,支持分区(这里子分区也包含在内)最大个数是8192。
6.不支持Query cache
分区表不支持query cache,在分区表的查询中自动避开了query cache。也就是说在分区表的查询语句中query cache是不起作用的。
7. 每个分区一个key caches
在MySQL 5.7版本中,可以通过CACHE INDEX和LOAD INDEX INTO CACHE来使用MyISAM分区表的key cache。可以为一个,几个或者所有分区都定义key cache,这样可以把一个,几个或者所有分区的索引预加载到key cache中。
8.不支持InnoDB分区表的外键
使用InnoDB引擎的分区表不支持外键。下面的两种具体情况来阐述:
- 在InnoDB表不能使用包含有外键的自定义分区;如果已经使用了外键的InnoDB表,则不能被分区。
- InnoDB表不能包含一个和用户自定义分区表相关的外键;使用了用户自定义分区的InnoDB表,不能包含和外键相关的列。
列出的限制的范围,包括使用InnoDB存储引擎的所有表。
违反这些限制的CREATE TABLE和ALTER TABLE语句,是不被允许的。
9. ALTER TABLE … ORDER BY
如果在分区表上执行ALTER TABLE … ORDER BY的话,会导致每个分区的行排序。
10. REPLACE语句在修改primary key上的效率
在某些情况下,需要修改表的primary key,如果你的应用程序使用了REPLACE语句,这些语句的结果可能会被大幅度修改。
11. 全文索引
分区表不支持全文索引或者搜索,即使分区表的存储引擎是InnoDB或者MyISAM也不行。
12. 空间列
分区表不支持空间列,比如点或者几何。
13.临时表
不能对临时表进行分区(Bug #17497)。
14. 日志表
不能对日志表进行分区,如果强制执行ALTER TABLE … PARTITION BY … 语句会报错。
15. 分区键的数据类型
分区键必须是整形或者结果是整形的表达式。不能用结果为ENUM类型的表达式。
下面两种情况例外:
- 当用LINER分区时,可以使用除TEXT或者BLOBS以外的数据类型作为分区键,因为MySQL内部的 hash函数会从这些列中产生正确的数据类型。
- 当用RANGE,LIST,DATE或者DATETIME列分区的话,可能会用string。
16. 子查询
即使子查询避开整形值或者NULL值,分区键不能子查询。
17. 子分区的问题
子分区必须使用HASH或者KEY分区,只有RANGE和LIST分区支持被子分区。
SUBPARTITION BY KEY要求显示指定子分区列,不像PARTITION BY KEY可以省略(这种情况下会默认使用表的primary key)。
18. 数据字典和索引字典选项
分区表的数据字典和索引字典受以下因素制约:
- 表级的数据字典和索引字典被忽略(Bug #32091)。
- 在Windows系统上,MyISAM分区表不支持独立分区或子分区的数据字典和索引字典选项。但是支持InnoDB分区表的独立分区或者子分区的数据字典。
19. 修复和重建分区表
分区表支持CHECK TABLE、 OPTIMIZE TABLE、ANALYZE TABLE、以及REPAIR TABLE语句。
分区表不支持mysqlcheck、myisamchk、以及myisampack操作。
20.导出选项
在MySQL 5.7.4以前的版本,不支持InnoDB分区表的FLUSH TABLES语句的导出选项(Bug #16943907)。
以上,是MySQL面试题【MySQL分区表有哪些限制因素】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—