`
gaojingsong
  • 浏览: 1182401 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Mysql分区技术(一)--创建分区表

阅读更多
分区的作用:数据库性能的提升和简化数据管理

在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。
分区技术使得数据管理变得简单,删除某个分区不会对另外的分区造成影响,分区有系统直接管理不用手工干预。


查询当前的mysql数据库版本是否支持分区
show variables like '%partition%';

分区类型
【RANGE 分区】:
基于属于一个给定连续区间的列值,把多行分配给分区。

 

【LIST 分区】:
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

 

【HASH分区】:
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

 

【KEY分区

分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

 

【复合分区】:RANGE—HASH,    LIST—HASH,   RANGE—Key,     LIST—Key

[root@node1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.28 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye
[root@node1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.28 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> show variables like '%partition%';
Empty set (0.00 sec)
【RANGE 分区】: 
 
mysql> create table emp_age_range

    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> age int
    -> )
    -> partition by range(age)
    -> (
    -> partition p1 values less than (10),
    -> partition p2 values less than (20),
    -> partition p3 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.80 sec)

mysql> create table emp_birthdate_range
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(year(birthdate))
    -> (
    -> partition p1 values less than (1980),
    -> partition p2 values less than (1990),
    -> partition p3 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.50 sec)
【LIST 分区】 
 
mysql> create table emp_deptno_list
  
-> (empno  varchar(20) not null ,

    -> empname varchar(20),
    -> deptno  int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by list(deptno)
    -> (
    -> partition p1 values in  (10),
    -> partition p2 values in  (20),
    -> partition p3 values  in  (30)
    -> );
Query OK, 0 rows affected (0.66 sec)

【HASH分区】
 
mysql> create table emp_birthday_hash
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by hash(year(birthdate))
    -> partitions 4;
Query OK, 0 rows affected (0.41 sec)

【KEY分区
 
mysql> create table emp_birthdate_key

    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by key(birthdate)
    -> partitions 4;
Query OK, 0 rows affected (1.00 sec)

【复合分区】
 
mysql> create table emp_birthdate_range_hash
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(salary)
    -> subpartition by hash(year(birthdate))
    -> subpartitions 3
    -> (
    -> partition p1 values less than (2000),
    -> partition p2 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.56 sec)

mysql> create table emp_salary_range_key
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(salary)
    -> subpartition by key(birthdate)
    -> subpartitions 3
    -> (
    -> partition p1 values less than (2000),
    -> partition p2 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.62 sec)

mysql> CREATE TABLE emp_birthdate_list_hash (
    -> empno varchar(20) NOT NULL,
    -> empname varchar(20) ,
    -> deptno int,
    -> birthdate date NOT NULL,
    -> salary int
    -> 
    -> )
    -> PARTITION BY list (deptno)
    -> subpartition by hash(year(birthdate))
    -> subpartitions 3
    -> (
    -> PARTITION p1 VALUES in  (10),
    -> PARTITION p2 VALUES in  (20)
    -> );
Query OK, 0 rows affected (0.55 sec)

mysql> CREATE TABLE emp_list_key (
    -> empno varchar(20) NOT NULL,
    -> empname varchar(20) ,
    -> deptno int,
    -> birthdate date NOT NULL,
    -> salary int
    -> )
    -> PARTITION BY list (deptno)
    -> subpartition by key(birthdate)
    -> subpartitions 3
    -> (
    -> PARTITION p1 VALUES in  (10),
    -> PARTITION p2 VALUES in  (20)
    -> );
Query OK, 0 rows affected (0.88 sec)

mysql> show tables;
+--------------------------+
| Tables_in_test           |
+--------------------------+
| emp_age_range            |
| emp_birthdate_key        |
| emp_birthdate_list_hash  |
| emp_birthdate_range      |
| emp_birthdate_range_hash |
| emp_birthday_hash        |
| emp_deptno_list          |
| emp_list_key             |
| emp_salary_range_key     |
+--------------------------+
9 rows in set (0.00 sec)


1.可以查看创建分区表的create语句   show create table 表名
2.可以查看表是不是分区表      show table status 
3.查看information_schema.partitions表 ,可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等信息
select 
  *
from information_schema.partitions  where 
  table_schema = schema()  
  and table_name='test';  
4.查看SQL执行计划,explain partitions select语句
通过此语句来显示扫描哪些分区,及他们是如何使用的.
mysql> desc emp_age_range;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| empno   | varchar(20) | NO   |     | NULL    |       |
| empname | varchar(20) | YES  |     | NULL    |       |
| deptno  | int(11)     | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql>  show create table emp_age_range;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                                                                                                                                                                                                                                      |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp_age_range | CREATE TABLE `emp_age_range` (
  `empno` varchar(20) NOT NULL,
  `empname` varchar(20) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (age)
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

mysql> select 
    ->   partition_name part,  
    ->   partition_expression expr,  
    ->   partition_description descr,  
    ->   table_rows  
    -> from information_schema.partitions  where 
    ->   table_schema = schema()  ;
+------+-----------------+----------+------------+
| part | expr            | descr    | table_rows |
+------+-----------------+----------+------------+
| p1   | age             | 10       |          0 |
| p2   | age             | 20       |          0 |
| p3   | age             | MAXVALUE |          0 |
| p0   | `birthdate`     | NULL     |          0 |
| p1   | `birthdate`     | NULL     |          0 |
| p2   | `birthdate`     | NULL     |          0 |
| p3   | `birthdate`     | NULL     |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p1   | year(birthdate) | 1980     |          0 |
| p2   | year(birthdate) | 1990     |          0 |
| p3   | year(birthdate) | MAXVALUE |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p0   | year(birthdate) | NULL     |          0 |
| p1   | year(birthdate) | NULL     |          0 |
| p2   | year(birthdate) | NULL     |          0 |
| p3   | year(birthdate) | NULL     |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p3   | deptno          | 30       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
+------+-----------------+----------+------------+
41 rows in set (0.01 sec)

mysql> select 
    ->   *
    -> from information_schema.partitions  where 
    ->   table_schema = schema()  ;

  • 大小: 74.4 KB
  • 大小: 147.5 KB
0
0
分享到:
评论

相关推荐

    MySQL分区表自动创建及删除存储过程

    MySQL分区表是一种优化大型数据表查询效率的技术,它将一个大表分成多个逻辑上相连但物理上独立的部分,每个部分称为一个分区。分区可以按照不同的策略进行,如范围、哈希、列表或复合分区。这样做有助于提高数据...

    创建mysql表分区的方法

    **创建分区表的步骤** 1. **创建表结构**:首先创建普通表,定义主键和其他列。 2. **定义分区**:使用`PARTITION BY`关键字后跟分区类型(RANGE, LIST, HASH, 或 KEY),然后指定分区列和条件。 3. **添加数据**:...

    mysql-connector-java-5.1.37-jar

    5. 兼容MySQL服务器的新特性:如支持分区表、存储过程、触发器等。 使用"mysql-connector-java-5.1.37.jar"的步骤通常如下: 1. 将JAR文件添加到Java项目的类路径中,可以是构建工具(如Maven或Gradle)的依赖,也...

    mysql实现自动创建与删除分区

    基础表.txt文件可能包含了创建分区表的SQL语句示例,例如: ```sql CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, date_column DATE NOT NULL, -- 其他列 ) PARTITION BY RANGE (TO_DAYS(date_...

    mysql-存储分区-实验八.docx

    MySQL存储分区是数据库管理系统中一种优化查询性能和管理大量数据的技术。通过将大表分成多个较小、更易管理和处理的部分,存储分区可以提高查询效率,减少维护成本,并有助于数据的组织和备份。以下是对实验内容的...

    mysql-connector-java-5.1.49.tar.gz

    此外,开发者还可以使用JDBC的CallableStatement来调用存储过程,或者利用MySQL的特定特性,比如分区表,视图,触发器等。 总的来说,`mysql-connector-java-5.1.49.tar.gz`是一个对于Java开发者至关重要的组件,它...

    windows版mysql安装包-mysql5-mysql-5.5.zip

    MySQL Workbench是一款图形化管理工具,可用于创建数据库模型、管理数据库对象、执行SQL查询、备份和恢复等操作。它是MySQL 5.5安装包的一部分,可以极大地提高数据库管理和开发的效率。 7. **安全与维护** - **...

    mysql 数据库表分区

    MySQL 数据库表分区是一种优化大数据查询的技术,尤其适用于存储海量数据的应用场景。通过将大表分成更小、更易管理的部分,分区可以提高查询性能,减少数据处理的时间,并且简化数据管理和备份过程。 1. **分区...

    mysql-connector-j-8.0.31

    此外,它还支持MySQL的特性,如SSL连接、分区表、复制和负载均衡。 总结来说,"mysql-connector-j-8.0.31"是Java开发者连接MySQL数据库的关键组件,通过理解JDBC机制和有效使用这个驱动,可以实现高效、安全的...

    MySQL5.1新功能-分区

    - 不是所有操作都支持分区,如自连接查询可能不适用于分区表。 - 分区设计应考虑业务需求,避免过度分区导致的复杂性增加。 - 分区不是万能的,对于小表或者查询范围跨越多个分区的场景,可能无法显著提升性能。 ...

    mysql for Linux (mysql-standard-4.1.22-pc-linux-gnu-i686.tar.gz )

    MySQL有许多性能优化策略,包括创建索引、调整查询语句、使用分区表、启用缓存等。MySQL还支持复制技术,可以实现主从复制,提高可用性和扩展性。 总结,`mysql-standard-4.1.22-pc-linux-gnu-i686.tar.gz` 是Linux...

    mysql80-community-release-el8-1.noarch.7z

    - 分区表改进:支持更多的分区类型和操作,例如在线重定义分区。 - 自动化备份和恢复工具:MySQL Enterprise Backup 提供了自动化和灵活的备份选项,简化了数据保护流程。 在开发和学习环境中,MySQL 8.0 提供了一...

    mysql-installer-community-8.0.28.0 MySql数据库安装包

    8. **分区改进**:MySQL 8.0对分区功能进行了优化,提供了更多的分区策略,使得大数据管理和查询更高效。 9. **查询优化器改进**:新的优化器策略和统计信息收集方法,使得MySQL能更准确地选择最佳执行计划。 **...

    MySQL分区分表方案实践手册

    #### 一、MySQL分区简介 数据库分区是一项重要的物理数据库设计技术,主要用于优化数据库性能并简化数据管理。MySQL的分区主要包括两种形式:水平分区和垂直分区。 - **水平分区(Horizontal Partitioning)**:这...

    mysql-connector-java-5.0.8-bin.jar

    7. **支持多种数据库特性**:如存储过程、触发器、视图等,以及MySQL特有的特性如分区表、全文索引等。 在实际应用中,开发者通常将mysql-connector-java-5.0.8-bin.jar添加到项目的类路径中,然后通过以下代码示例...

    互联网公司为啥不使用mysql分区表

    在互联网公司中,mysql分区表是一个比较少用的技术,这是因为分区表存在一些缺陷和限制,使得互联网公司更多地选择自己分库分表来水平扩展数据库。 首先,分区表的设计需要考虑到分区键的设计,不同的分区键设计会...

    MySQL-client-5.6.29-1.linux_glibc2.5.x86_64,MySQL-server-5.6.29-1.linux_glibc

    Hive通常会将元数据(例如表结构和分区信息)存储在关系数据库中,MySQL是一个常见的选择。集成MySQL可以提供高可用性和可扩展性,确保Hive的数据管理层面上的稳定性。 `Linux下的Mysql安装.doc`可能提供了在Linux...

    mysql表分区

    MySQL表分区是数据库管理系统(DBMS)中用于提高大数据量表的存储性能和管理效率的一种技术。通过对一个大表进行分区,可以将数据分散存储到多个物理区域中,从而改善性能,尤其是在涉及大量读写操作的场景中。MySQL...

Global site tag (gtag.js) - Google Analytics