本文测试的版本

XML/HTML代码

mysql>select version();

+------------+

| version() |

+------------+

| 5.1.33-log |

+------------+

1 row in set (0.00 sec)

一、关于Partitioning Keys, Primary Keys, and Unique

Keys的限制

在5.1中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。

这句话也许不好理解,我们做几个实验:

SQL代码

CREATETABLEt1

( id INTNOTNULL,

uid INTNOTNULL,

PRIMARYKEY(id)

)

PARTITION BYRANGE (id)

(PARTITION p0 VALUESLESS THAN(5) ENGINE = INNODB,

PARTITION p1 VALUESLESS THAN(10) ENGINE = INNODB

);

CREATETABLEt1

( id INTNOTNULL,

uid INTNOTNULL,

PRIMARYKEY(id)

)

PARTITION BYRANGE (id)

(PARTITION p0 VALUESLESS THAN(5) ENGINE = MyISAM DATA DIRECTORY='/tmp'INDEXDIRECTORY='/tmp',

PARTITION p1 VALUESLESS THAN(10) ENGINE = MyISAM DATA DIRECTORY='/tmp'INDEXDIRECTORY='/tmp'

);

mysql> CREATETABLEt1

-> ( id INTNOTNULL,

-> uid INTNOTNULL,

-> PRIMARYKEY(id),

-> UNIQUEKEY(uid)

-> )

-> PARTITION BYRANGE (id)

-> (PARTITION p0 VALUESLESS THAN(5),

-> PARTITION p1 VALUESLESS THAN(10)

-> );

ERROR 1503 (HY000): A UNIQUEINDEXmust includeallcolumnsinthetable's partitioningfunction

二、关于存储引擎的限制

2.1 MERGE引擎不支持分区,分区表也不支持merge。

2.2 FEDERATED引擎不支持分区。这限制可能会在以后的版本去掉。

2.3 CSV引擎不支持分区

2.4 BLACKHOLE引擎不支持分区

2.5 在NDBCLUSTER引擎上使用分区表,分区类型只能是KEY(or LINEAR KEY) 分区。

2.6

当升级MYSQL的时候,如果你有使用了KEY分区的表(不管是什么引擎,NDBCLUSTER除外),那么你需要把这个表dumped在

reloaded。

2.7 分区表的所有分区或者子分区的存储引擎必须相同,这个限制也许会在以后的版本取消。

不指定任何引擎(使用默认引擎)。

所有分区或者子分区指定相同引擎。

三、关于函数的限制

在mysql5.1中建立分区表的语句中,只能包含下列函数:

ABS()

CEILING() and FLOOR() (在使用这2个函数的建立分区表的前提是使用函数的分区键是INT类型),例如

XML/HTML代码

mysql>CREATE TABLE t (c FLOAT) PARTITION BY LIST( FLOOR(c) )(

->PARTITION p0 VALUES IN (1,3,5),

->PARTITION p1 VALUES IN (2,4,6)

->);;

ERROR 1491 (HY000): The PARTITION function returns the wrong type

mysql>CREATE TABLE t (c int) PARTITION BY LIST( FLOOR(c) )(

->PARTITION p0 VALUES IN (1,3,5),

->PARTITION p1 VALUES IN (2,4,6)

->);

Query OK, 0 rows affected (0.01 sec)

DAY()

DAYOFMONTH()

DAYOFWEEK()

DAYOFYEAR()

DATEDIFF()

EXTRACT()

HOUR()

MICROSECOND()

MINUTE()

MOD()

MONTH()

QUARTER()

SECOND()

TIME_TO_SEC()

TO_DAYS()

WEEKDAY()

YEAR()

YEARWEEK()

四、其他限制

4.1 对象限制

下面这些对象在不能出现在分区表达式

Stored functions, stored procedures, UDFs, or plugins.

Declared variables or user variables.

4.2 运算限制

支持加减乘等运算出现在分区表达式,但是运算后的结果必须是一个INT或者NULL。 |, &, ^, <

>>, , ~ 等不允许出现在分区表达式。

4.3 sql_mode限制

官方强烈建议你在创建分区表后,永远别改变mysql的sql_mode。因为在不同的模式下,某些函数或者运算返回的结果可能会不一样。

4.4 Performance considerations.(省略)

4.5 最多支持1024个分区,包括子分区。

当你建立分区表包含很多分区但没有超过1024限制的时候,如果报错 Got error 24 from storage

engine,那意味着你需要增大open_files_limit参数。

4.6 不支持外键。MYSQL中,INNODB引擎才支持外键。

4.7 不支持FULLTEXT indexes(全文索引),包括MYISAM引擎。

SQL代码

mysql>CREATETABLEarticles (

-> id INTUNSIGNED AUTO_INCREMENTNOTNULLPRIMARYKEY,

-> title VARCHAR(200),

-> body TEXT,

-> FULLTEXT (title,body)

-> )

-> PARTITION BYHASH(id)

-> PARTITIONS 4;

ERROR 1214 (HY000): The used tabletype doesn't support FULLTEXT indexes

4.8

不支持spatial column types。

4.9 临时表不能被分区。

SQL代码

mysql>CREATETemporaryTABLEt1

-> ( id INTNOTNULL,

-> uid INTNOTNULL,

-> PRIMARYKEY(id)

-> )

-> PARTITION BYRANGE (id)

-> (PARTITION p0 VALUESLESS THAN(5) ENGINE = MyISAM,

-> PARTITION p1 VALUESLESS THAN(10) ENGINE = MyISAM

-> );

ERROR 1562 (HY000): Cannot createtemporarytablewithpartitions

4.10

log table不支持分区。

SQL代码

mysql>altertablemysql.slow_log PARTITIONBYKEY(start_time) PARTITIONS 2;

ERROR 1221 (HY000): Incorrect usage ofPARTITIONandlogtable

5.11

分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键(

BLOB or TEXT 列除外)。

SQL代码

mysql>CREATETABLEtkc (c1CHAR)

-> PARTITION BYKEY(c1)

-> PARTITIONS 4;

Query OK, 0 rowsaffected (0.00 sec)

mysql> CREATETABLEtkc2 (c1CHAR)

-> PARTITION BYHASH(c1)

-> PARTITIONS 4;

ERROR 1491 (HY000): The PARTITION functionreturnsthe wrong type

mysql> CREATETABLEtkc3 (c1INT)

-> PARTITION BYHASH(c1)

-> PARTITIONS 4;

Query OK, 0 rowsaffected (0.00 sec)

5.12 分区键不能是一个子查询。 A partitioning key may not be a subquery, even if

that subquery resolves to an integer value or NULL

5.13 只有RANG和LIST分区能进行子分区。HASH和KEY分区不能进行子分区。

5.14 分区表不支持Key caches。

SQL代码

mysql>SETGLOBALkeycache1.key_buffer_size=128*1024;

Query OK, 0 rowsaffected (0.00 sec)

mysql> CACHE INDEXlogin,user_msg,user_msg_pINkeycache1;

+-----------------+--------------------+----------+---------------------------------------------------------------------+

| Table| Op | Msg_type | Msg_text |

+-----------------+--------------------+----------+---------------------------------------------------------------------+

| test.login | assign_to_keycache | status | OK |

| test.user_msg | assign_to_keycache | status | OK |

| test.user_msg_p | assign_to_keycache | note | The storage engine forthetabledoesn't support assign_to_keycache |

+-----------------+--------------------+----------+---------------------------------------------------------------------+

3 rowsinset(0.00 sec)

5.15

分区表不支持INSERT DELAYED.

SQL代码

mysql>insertDELAYEDintouser_msg_pvalues(18156629,0,0,0,0,0,0,0,0,0);

ERROR 1616 (HY000): DELAYED optionnotsupportedfortable'user_msg_p'

5.16

DATA DIRECTORY 和 INDEX DIRECTORY 参数在分区表将被忽略。

这个限制应该不存在了:

SQL代码

mysql>CREATETABLEt1

-> ( id INTNOTNULL,

-> uid INTNOTNULL,

-> PRIMARYKEY(id)

-> )

-> PARTITION BYRANGE (id)

-> (PARTITION p0 VALUESLESS THAN(5) ENGINE = MyISAM DATA DIRECTORY='/tmp'INDEXDIRECTORY='/tmp',

-> PARTITION p1 VALUESLESS THAN(10) ENGINE = MyISAM DATA DIRECTORY='/tmp'INDEXDIRECTORY='/tmp'

-> );

Query OK, 0 rowsaffected (0.01 sec)

5.17

分区表不支持mysqlcheck和myisamchk

在5.1.33版本中已经支持mysqlcheck和myisamchk

SQL代码

./mysqlcheck -u -p -r test user_msg_p;

test.user_msg_p OK

./myisamchk -i /u01/data/test/user_msg_p#P#p0.MYI

Checking MyISAM file: /u01/data/test/user_msg_p#P#p0.MYI

Data records: 4423615 Deleted blocks: 0

- checkfile-size

- checkrecorddelete-chain

- checkkeydelete-chain

- checkindexreference

- checkdata recordreferencesindex: 1

Key: 1: Keyblocks used: 98% Packed: 0%Maxlevels: 4

Total: Keyblocks used: 98% Packed: 0%

Usertime0.97, Systemtime0.02

Maximum resident setsize0, Integral residentsetsize0

Non-physical pagefaults 324, Physical pagefaults 0, Swaps 0

Blocks in0out0, Messagesin0out0, Signals 0

Voluntary context switches 1, Involuntary context switches 5

5.18

分区表的分区键创建索引,那么这个索引也将被分区。分区键没有全局索引一说。

5.19 在分区表使用ALTER TABLE … ORDER BY,只能在每个分区内进行order by。

mysql 表分区优缺点_Mysql分区表局限性总结相关推荐

  1. mysql 交换分区吗_MySQL分区表——交换分区

    从MySQL 5.6开始,支持分区交换.就是将一个分区表中的一个分区和一个普通表中的数据互换.一.实现交换分区的基本语法:ALTER TABLEptEXCHANGE PARTITIONpWITH TA ...

  2. mysql分区表优缺点,Mysql 表分区和性能

    以下内容节选自 mysql表分区: 分区功能并不是所有存储引擎都支持的,如CSV.MERGE等就不支持.mysql数据库支持的分区类型为水平分区(指一张表中不同行的记录分配到不同的物理文件中),不支持 ...

  3. mysql 支持分区表,mysql表分区的限制

    头一次使用mysql表分区,遇到不少的问题,现在总结下遇到的问题和解决方案. 1.如果分区值类型不是整型值,会出现如下错误: [Err] 1697 - VALUES value for partiti ...

  4. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  5. maxvalue mysql自动分区_创建mysql表分区的方法

    创建 mysql 表分区的方法 我来给大家介绍一下 mysql 表分区创建与使用吧,希望对各位同学会有所帮助.表分区的测试使用,主要内容来自 于其他博客文章以及 mysql5.1 的参考手册. 表分区 ...

  6. mysql 表分区、按时间函数分区、删除分区、自动添加表分区

    mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...

  7. MySql表分区介绍

    一.什么是表分区 表分区就是就是把表的数据切分成不同的块进行存储,可以存储在不同的文件系统.而用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数 ...

  8. MySQL表分区细节逻辑

    MySQL表分区细节逻辑 一.建表时进行分区 二.建表后进行分区(消耗资源巨大) 一.建表时进行分区 Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键: create table i ...

  9. Mysql表分区的选择与实践小结

    2019独角兽企业重金招聘Python工程师标准>>> 在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表, ...

最新文章

  1. Tkinter之Label
  2. HTML+CSS+JavaScript复习笔记持更(八)——CSS3常用属性之列表
  3. 哈夫曼树编码与译码(完整C/C++实现代码)
  4. 中小企业怎样转型做跨境电商独立站?
  5. 大数据如何助力农业发展
  6. python打印支票_转账支票、现金支票日期大写对照表(数字大写)
  7. 【Excel学习笔记8】“定位”可以用来干嘛?
  8. Unable to import maven project: See logs for details
  9. 你的个人所得税完税证明看准了吗?
  10. 车载网络测试 - 车载以太网 - 传统配置方法(Channel Base)
  11. 5,15-二(3,4,5-三(三丙氧苯基)卟啉(BTPPP),[5,15-二乙炔基-10,20-二(3,4,5-三(十六烷氧基)苯基)卟啉]锌(DBTCPP-Zn)齐岳生物供应
  12. Unity 获取鼠标点击图片时 获取点击位置的像素
  13. 1.Cocos跑酷游戏——List工具篇
  14. Java去掉标点符号的方法
  15. vue [ECharts] Unkown series surface
  16. 2021年煤矿采煤机(掘进机)操作考试及煤矿采煤机(掘进机)操作模拟试题
  17. Excel-Python对数据进行线性回归
  18. 年轻就要勇敢闯荡校园招聘会PPT模板
  19. php开启mysql扩展
  20. MySQL查询优化之五-嵌套循环连接算法(Nested-Loop Join Algorithms)

热门文章

  1. Web优化 --利用css sprites降低图片请求
  2. [转]使用Navicat for Oracle工具连接oracle的
  3. 闭包/Block当成函数参数实现回调
  4. 比较DataTable中新旧数据
  5. ReadDirectoryChangesW 函数
  6. 软件本地化 pdf_软件本地化与标准翻译
  7. 霸县计算机学校,廊坊中专排名2021
  8. Java 到底有没有析构函数呢?
  9. 农民约翰是一个惊人的会计_我的朋友约翰在CSS Grid中犯了一个错误。 不要像约翰-这样做。
  10. 到2025年将保持不变的热门流行技术