`
flowercat
  • 浏览: 362307 次
社区版块
存档分类
最新评论

(转)Mysql分区表局限性总结

阅读更多
Mysql5.1已经发行很久了,本文根据官方文档的翻译和自己的一些测试,对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅。

本文测试的版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.1.33-log |
+------------+
1 row in set (0.00 sec)

一、关于Partitioning Keys, Primary Keys, and Unique Keys的限制

在5.1中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
这句话也许不好理解,我们做几个实验:

CREATE TABLE t1  
(      id INT NOT NULL,     
       uid INT NOT NULL,
       PRIMARY KEY (id)
)
PARTITION BY RANGE (id)  
(PARTITION p0 VALUES LESS THAN(5) ENGINE = INNODB,
PARTITION p1 VALUES LESS THAN(10) ENGINE = INNODB
);

CREATE TABLE t1  
(      id INT NOT NULL,     
       uid INT NOT NULL,
       PRIMARY KEY (id)
)
PARTITION BY RANGE (id)  
(PARTITION p0 VALUES LESS THAN(5) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp',
PARTITION p1 VALUES LESS THAN(10) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp'
);

mysql> CREATE TABLE t1  
    -> (      id INT NOT NULL,     
    ->        uid INT NOT NULL,
    ->        PRIMARY KEY (id),
    ->        UNIQUE KEY (uid)
    -> )
    -> PARTITION BY RANGE (id)  
    -> (PARTITION p0 VALUES LESS THAN(5),
    ->  PARTITION p1 VALUES LESS THAN(10)
    -> );
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

二、关于存储引擎的限制
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类型),例如

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引擎。

mysql> CREATE TABLE articles (
    -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> title VARCHAR(200),
    -> body TEXT,
    -> FULLTEXT (title,body)
    -> )
    -> PARTITION BY HASH(id)
    -> PARTITIONS 4;
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes

4.8 不支持spatial column types。
4.9 临时表不能被分区。

mysql> CREATE Temporary TABLE t1  
    -> (      id INT NOT NULL,     
    ->        uid INT NOT NULL,
    ->        PRIMARY KEY (id)
    -> )
    -> PARTITION BY RANGE (id)  
    -> (PARTITION p0 VALUES LESS THAN(5) ENGINE = MyISAM,
    ->  PARTITION p1 VALUES LESS THAN(10) ENGINE = MyISAM
    -> );
ERROR 1562 (HY000): Cannot create temporary table with partitions

4.10 log table不支持分区。

mysql> alter table mysql.slow_log PARTITION BY KEY(start_time) PARTITIONS 2;
ERROR 1221 (HY000): Incorrect usage of PARTITION and log table

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

mysql> CREATE TABLE tkc (c1 CHAR)
    -> PARTITION BY KEY(c1)
    -> PARTITIONS 4;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE tkc2 (c1 CHAR)
    -> PARTITION BY HASH(c1)
    -> PARTITIONS 4;
ERROR 1491 (HY000): The PARTITION function returns the wrong type

mysql> CREATE TABLE tkc3 (c1 INT)
    -> PARTITION BY HASH(c1)
    -> PARTITIONS 4;
Query OK, 0 rows affected (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。

mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Query OK, 0 rows affected (0.00 sec)
mysql> CACHE INDEX login,user_msg,user_msg_p IN keycache1;
+-----------------+--------------------+----------+---------------------------------------------------------------------+
| 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 for the table doesn't support assign_to_keycache |
+-----------------+--------------------+----------+---------------------------------------------------------------------+
3 rows in set (0.00 sec)

5.15 分区表不支持INSERT DELAYED.

mysql> insert  DELAYED into user_msg_p values(18156629,0,0,0,0,0,0,0,0,0);
ERROR 1616 (HY000): DELAYED option not supported for table 'user_msg_p'

5.16 DATA DIRECTORY 和 INDEX DIRECTORY 参数在分区表将被忽略。
这个限制应该不存在了:
注:在创建InnoDB引擎的情况下,还是会忽略,即使已经打开innodb_file_per_table,还是需要手动做符号连接。
例如:
drop table if exists ts ;
CREATE TABLE ts (id INT, purchased DATE)
    ENGINE=innodb
    PARTITION BY RANGE(YEAR(purchased))
    SUBPARTITION BY HASH(id)
    (
        PARTITION p0 VALUES LESS THAN (1990)
        (
            SUBPARTITION s0
            DATA DIRECTORY='/usr/local/mysql/data0'
            INDEX DIRECTORY='/usr/local/mysql/index0',
            SUBPARTITION s1
            DATA DIRECTORY='/usr/local/mysql/data1'
            INDEX DIRECTORY='/usr/local/mysql/index1'
        ),
        PARTITION p1 VALUES LESS THAN (MAXVALUE)
        (
            SUBPARTITION s2
            DATA DIRECTORY='/usr/local/mysql/data1'
            INDEX DIRECTORY='/usr/local/mysql/index1',
            SUBPARTITION s3
            DATA DIRECTORY='/usr/local/mysql/data2'
            INDEX DIRECTORY='/usr/local/mysql/index2'
        )
    );
手动做完符号连接后如下:
-rw-rw---- 1 mysql mysql     8596 02-28 22:07 ts.frm
-rw-rw---- 1 mysql mysql       56 02-28 22:07 ts.par
lrwxrwxrwx 1 mysql mysql       40 02-28 22:30 ts#P#p0#SP#s0.ibd -> /usr/local/mysql/data0/ts#P#p0#SP#s0.ibd
lrwxrwxrwx 1 mysql mysql       40 02-28 22:31 ts#P#p0#SP#s1.ibd -> /usr/local/mysql/data0/ts#P#p0#SP#s1.ibd
lrwxrwxrwx 1 mysql mysql       40 02-28 22:31 ts#P#p1#SP#s2.ibd -> /usr/local/mysql/data0/ts#P#p1#SP#s2.ibd
lrwxrwxrwx 1 mysql mysql       40 02-28 22:31 ts#P#p1#SP#s3.ibd -> /usr/local/mysql/data0/ts#P#p1#SP#s3.ibd

mysql> CREATE TABLE t1  
    -> (      id INT NOT NULL,     
    ->        uid INT NOT NULL,
    ->        PRIMARY KEY (id)
    -> )
    -> PARTITION BY RANGE (id)  
    -> (PARTITION p0 VALUES LESS THAN(5) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp',
    ->  PARTITION p1 VALUES LESS THAN(10) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp'
    -> );
Query OK, 0 rows affected (0.01 sec)

5.17 分区表不支持mysqlcheck和myisamchk
在5.1.33版本中已经支持mysqlcheck和myisamchk

./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
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:    0%

User time 0.97, System time 0.02
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 324, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 1, Involuntary context switches 5

5.18 分区表的分区键创建索引,那么这个索引也将被分区。分区键没有全局索引一说。
5.19 在分区表使用ALTER TABLE … ORDER BY,只能在每个分区内进行order by。
分享到:
评论

相关推荐

    Oracle的表结构转成Mysql的表结构

    ### Oracle的表结构转成MySQL的表结构 #### 功能概述 本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数...

    基于MySQL分区性能的详细介绍

    然而,MySQL分区也有其局限性,如: - **仅限整型列或可转化为整型的列进行分区**。 - **最大分区数量不超过1024个**。 - **分区列必须包含在所有唯一索引或主键中**。 - **不支持外键约束**。 - **不支持全文索引**...

    高性能MySQL(第3版).part2

    6.5MySQL查询优化器的局限性223 6.5.1关联子查询223 6.5.2UNION的限制228 6.5.3索引合并优化228 6.5.4等值传递229 6.5.5并行执行229 6.5.6哈希关联229 6.5.7松散索引扫描229 6.5.8最大值和最小值优化231 ...

    MySQL 5.1中文手冊

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    mysql官方中文参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL-5.7新增功能全揭秘中文版

    MySQL 5.7 是 MySQL 数据库管理系统的一个重要版本,它引入了一系列新的特性和改进,这些特性旨在提高数据库性能、增强数据处理能力以及提升数据库管理的便利性。本文将深入探讨 MySQL 5.7 中的关键新增功能。 ####...

    MYSQL表的类型.rar

    每种表类型都有其优势和局限性,选择哪种类型取决于具体的应用需求。例如,如果你需要事务处理和高并发写入,InnoDB是最佳选择;而如果需要高速读取且数据丢失无妨,可以考虑Memory表。了解并正确选择MySQL表类型...

    MySQL 5.1参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL播客剪辑

    尽管仍存在一些限制,如复制和分区功能的局限性,以及查询优化的提升空间,但MySQL作为一个开源的DBMS,已经展现出足够的实力。 **第一部分:MySQL架构与概念** 1. **MySQL逻辑架构** - **连接处理、认证和安全...

    MySQL面试总结宝典.pdf

    - **查询缓存**:理解MySQL查询缓存的工作原理和局限性。 - **分区与分片**:如何通过分区策略来提高大数据量的处理能力。 6. **安全性**: - **权限管理**:GRANT和REVOKE命令的使用,理解用户权限的层次结构。...

    MySQL 5.1官方简体中文参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1参考手册 (中文版)

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1参考手册中文版

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...

    mysql5.1中文手册

    MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取...

    Mysql数据表分区技术PARTITION浅析

    然而,分区也有其局限性,例如,不是所有类型的 SQL 操作都支持分区,如某些复杂的联接操作可能不会利用分区的优势。此外,分区管理需要额外的资源,对于小规模的数据表,分区可能并不适用。 总的来说,MySQL 的...

    MySQL5.1参考手册官方简体中文版

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MYSQL中文手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT...

    mysql windows32位 绿色版

    MySQL是世界上最受欢迎的开源...总的来说,MySQL Windows 32位绿色版为用户提供了在32位Windows系统上快速部署和使用的数据库解决方案,虽然有一定的局限性,但对个人项目或者小型应用来说,仍然是一种实用的选择。

Global site tag (gtag.js) - Google Analytics