MYSQL分区管理

--在mysql5.6之后查看分区采用

show plugins;

--不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分

mysql> create table t1(id int not null,id2 int not null,unique key(id)) partition by hash(id2) partitions 4;    

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table is partitioning function

--innodb与分区表不兼容

Partitioned InnoDB tables cannot have foreign key references, nor can they have columns referenced by foreign keys.

InnoDB tables which have or which are referenced by foreign keys cannot be partitioned

mysql> alter table t2 add foreign key(id) references t1(id);

ERROR 1215 (HY000): Cannot add foreign key constraint

--查看分区表

select * from information_schema.partitions p where p.partition_name is not null

and p.table_name='t1';

--查看某一分区执行计划

mysql> explain partitions select * from t1 where id2=1;  

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

| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | Extra       |

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

|  1 | SIMPLE      | t1    | p1         | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where | 

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

--查看某一分区内数据,如果有多个分区要查时,请使用分号隔开

mysql> select * from t1 partition(p1);                  

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

| id | id2 |

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

|  4 |   5 | 

|  8 |   9 | 

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

--mysql不支持在日期类型上直接创建分区,必需借助于函数

CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT,

store_id INT

)

PARTITION BY RANGE ( YEAR(separated) ) (

PARTITION p0 VALUES LESS THAN (1991),

PARTITION p1 VALUES LESS THAN (1996),

PARTITION p2 VALUES LESS THAN (2001),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

--按月进行分区,还是利用的函数

CREATE TABLE t (

id INT NOT NULL,

fired_date DATE NOT NULL DEFAULT '1970-01-01'

)

PARTITION BY RANGE ( extract(YEAR_MONTH from fired_date) ) (

PARTITION p0 VALUES LESS THAN (201601),

PARTITION p1 VALUES LESS THAN (201602),

PARTITION p2 VALUES LESS THAN (201603),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

--通过使用RANGE COLUMNS而不再需要使用函数

The use of partitioning columns employing date or time types other than DATE or DATETIME is not supported with RANGE COLUMNS

CREATE TABLE members (

firstname VARCHAR(25) NOT NULL,

lastname VARCHAR(25) NOT NULL,

username VARCHAR(16) NOT NULL,

email VARCHAR(35),

joined DATE 

)

PARTITION BY RANGE COLUMNS(joined) (

PARTITION p0 VALUES LESS THAN ('1960-01-01'),

PARTITION p1 VALUES LESS THAN ('1970-01-01'),

PARTITION p2 VALUES LESS THAN ('1980-01-01'),

PARTITION p3 VALUES LESS THAN ('1990-01-01'),

PARTITION p4 VALUES LESS THAN MAXVALUE

);

--对于range partition的null,mysql默认把它当作最小的值看待,如果列值为空,其会把它插入到第一个分区中

MariaDB [test]> insert into members(firstname,lastname,username) values ('rudy','gao','rudy.gao');

Query OK, 1 row affected (0.01 sec)

MariaDB [test]> select * from members;

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

| firstname | lastname | username | email | joined |

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

| rudy      | gao      | rudy.gao | NULL  | NULL   |

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

1 row in set (0.00 sec)

--在第一个分区中查询

MariaDB [test]> select * from members partition(p0);

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

| firstname | lastname | username | email | joined |

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

| rudy      | gao      | rudy.gao | NULL  | NULL   |

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

--对于list partition的null,如果没有指定一个list存储null时,其是不允许插入null值的

--A table that is partitioned by LIST admits NULL values if and only if one of its partitions is defined using that value-list that contains NULL. 

--The converse of this is that a table partitioned by LIST which does not explicitly use NULL in a value list rejects rows resulting in a NULL value for the partitioning expression

mysql> INSERT INTO ts1 VALUES (NULL, 'mothra');

ERROR 1504 (HY000): Table has no partition for value NULL

--对于hash或者key分区,null值被当做0处理

--NULL is handled somewhat differently for tables partitioned by HASH or KEY. 

--In these cases, any partition expression that yields a NULL value is treated as though its return value were zero

--注意对于RANGE COLUMNS其不能是表达式,但其可以接受多个列

 RANGE COLUMNS does not accept expressions, only names of columns.

 RANGE COLUMNS accepts a list of one or more columns

--如果RANGE COLUMNS有多列时,其必须满足所有列都符合相应条件时,才放入相对应的分区,否则会默认分区

CREATE TABLE rc1 (a INT,b INT)

PARTITION BY RANGE COLUMNS(a, b) (

PARTITION p0 VALUES LESS THAN (5, 12),

PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE)

);

mysql> INSERT INTO rc1 VALUES (5,10), (5,11), (5,12);

--查看各个分区表中行数

mysql> SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'rc1';

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

| PARTITION_NAME | TABLE_ROWS |

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

| p0             |          2 |

| p3             |          1 |

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

--其类似于如下的sql比较

mysql> SELECT (5,10) < (5,12), (5,11) < (5,12), (5,12) < (5,12);

--创建以key为分区的表,需要一个主键,如果没有,则mysql使用默认的虚拟主键

--KEY takes only a list of zero or more column names. Any columns used as the partitioning key must comprise part or all of the table's primary key, 

--if the table has one. Where no column name is specified as the partitioning key, the table's primary key is used, if there is one

CREATE TABLE k1 (

id INT NOT NULL PRIMARY KEY,

name VARCHAR(20)

)

PARTITION BY KEY()

PARTITIONS 2;

--对于已经创建的分区,最好不要改变它们的sql_mode

it is strongly recommended that you never change the server SQL mode after creating partitioned tables

Sometimes a change in the server SQL mode can make partitioned tables unusable

Differing SQL modes on master and slave can lead to partitioning expressions being evaluated differently

时间: 2024-11-02 20:17:55

MYSQL分区管理的相关文章

MySQL数据库分区管理 细节决定成败

在MySQL数据库中,表的不同部分在不同的位置被存储为单独的表.分区主要就是用来解决表在不同的位置存储的问题.在其他数据库中,也会存在这种情况.他们将这种类型的数据表称之为分区表.分区的管理,对于MySQL数据库来说至关重要.其直接跟数据库的性能与安全性息息相关.对于分区的管理,笔者只有两个字:细节. 细节一:确定所使用的版本是否支持分区 在MySQL中,并不是所有的数据库版本都支持分区管理.为此数据库管理员首先要做的就是,确认自己所采用的版本是否支持这个功能.如果支持的话,则可以在后续设计与维

MySQL的管理工具:phpMyAdmin使用简介

mysql 前言: 所谓的phpMyAdmin简单的说就是一种MySQL的管理工具.它可以直接从web上去管理MySQL,不需要到系统上去执行. 安装步骤: 1.取得档案ftp://ohaha.ks.edu.tw/pub/source/php/phpMyAdmin_2.0.5.tar.gz或是ftp://ohaha.ks.edu.tw/pub/source/php/c_phpMyAdmin_2.0.5.tar.gz其中唯一的差别是在於後者不需要再做中文最佳化的动作. 2.我们先采用前者然後再加上

ORACLE8的分区管理

摘要:本篇文章介绍了ORACLE数据库的新特性-分区管理,并用例子说明使用方法. 一. 分区概述: 为了简化数据库大表的管理,ORACLE8推出了分区选项.分区将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性.将大表分割成较小的分区可以改善表的维护.备份.恢复.事务及查询性能.针对当前社保及电信行业的大量日常业务数据,可以推荐使用ORACLE8的该选项. 二.分区的优点: 1 .增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然

MySQL的管理工具:phpMyAdmin

前言: 所谓的phpMyAdmin简单的说就是一种MySQL的管理工具. 透过此一程式,可以直接从web上去管理MySQL,不需要到系统上去执行. 安装步骤:  1.取得档案ftp://ohaha.ks.edu.tw/pub/source/php/phpMyAdmin_2.0.5.tar.gz或是ftp://ohaha.ks.edu.tw/pub/source/php/c_phpMyAdmin_2.0.5.tar.gz     其中唯一的差别是在於後者不需要再做中文最佳化的动作.    所谓的中

MySQL用户管理(转)

mysql|用户管理 MySQL用户管理[晏子]  http://clyan.hongnet.com/index.html MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么.MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限.两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法.CREATE和REVOKE语句影响4个表:

MySQL用户管理

mysql|用户管理 MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么.MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限.两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法.CREATE和REVOKE语句影响4个表:授权表 内容 user 能连接服务器的用户以及他们拥有的任何全局权限 db 数据库级权限 tables

DB2多分区管理总结

DB2的多分区管理通常会给大家有点挑战性,但是很多时候多分区和单分区管理差别不是很大,如下总结了常见的操作管理命 令: 启动指定分区的数据库节点: db2start dbpartitionnum DBNODENUM 在日常操作中,我们需要确 定当前连接节点号码,如下就是检查当前分区节点号码方法: db2 values current dbpartitionnum 在日常 多分区环境下 ,需要查看分区组数如下: db2 LIST DATABASE PARTITION GROUPS SHOW DET

Windows XP磁盘分区管理应用详解

与DOS环境下苦涩难懂的分区操作相比.在Windows XP中,利用图形界面和人性化的操作方式,可对硬盘进行更加高效灵活的分区操作.不仅如此,借用Windows XP强大的磁盘分区管理功能,还可增强磁盘分区的合理使用,并有效提升磁盘的读写速度. 1.一分钟内分区及格式化硬盘 右键点击"我的电脑",选择"管理"命令.在打开的"计算机管理"窗口中,依次展开"计算机管理"→"存储"→"磁盘管理"

mysql dba系统学习(15)mysql用户管理之二

mysql用户管理 一,创建和删除用户 mysql> select current_user();  查询当前的登录用户 +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+  创建用户的时候没有分配任何权限,%表示的是任何机器,但是不包括localhost和127.0.0.1 mysql> create user 'chenzhongyang'@'%' id