用途

  • 即使使用优化的查询,很大的表和索引也可能很慢。但是,如果目标表已分区,则读取少量分区的查询会更快。
  • 分区允许一个人在多个存储设备上分发文件。例如,我们可以将历史数据存储在较慢,较大的磁盘上(不应经常读取历史数据)。当前数据可以存储在速度更快的磁盘或SSD设备上。
  • 如果我们将历史数据与最近的数据分开,则可能需要对一个分区而不是整个表进行定期备份。

查看系统是否支持分区表

MariaDB [(none)]> SHOW PLUGINS;
......
| unix_socket                   | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| FEEDBACK                      | DISABLED | INFORMATION SCHEMA | NULL    | GPL     |
| user_variables                | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| partition                     | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+-------------------------------+----------+--------------------+---------+---------+
54 rows in set (0.002 sec)

分区表要确定用于分区的a partitioning type类型和表达式a partitioning expression.分区类型确定分区表的行如何跨分区分布。某些分区类型要求用户指定一个分区表达式,该表达式确定将行存储在哪个分区中。各个分区的大小取决于分区类型。读写性能受分区表达式的影响。因此,应谨慎选择这些选择。

mariadb支持的type: RANGE LIST RANGE COLUMNS and LIST COLUMNS, HASH COLUMNS HASH KEY LINEAR HASH, LINEAR KEY SYSTEM_TIME

RANGE分区

RANGE分区类型用于为每个分区分配由分区表达式生成的值的范围。范围必须是有序的,连续的且不重叠的。最小值始终包含在第一个范围内。最高值可以或可以不包括在最后一个范围内。

这种分区方法的一种变体RANGE COLUMNS允许我们使用多列和更多数据类型。

  • 创建语法
RANGE PARTITION BY RANGE(partitioning_expression)
(PARTITION partition_name VALUES LESS THAN(value),[PARTITION partition_name VALUES LESS THAN(value),...]
)

exampe:

#按年创建分区表
CREATE TABLE log
(id INT UNSIGNED NOT NULL AUTO_INCREMENT,timestamp DATETIME NOT NULL,user INT UNSIGNED,ip BINARY(16) NOT NULL,action VARCHAR(20) NOT NULL,PRIMARY KEY (id, timestamp)
)ENGINE = InnoDB
PARTITION BY RANGE (YEAR(timestamp))
(PARTITION p0 VALUES LESS THAN (2013),PARTITION p1 VALUES LESS THAN (2014),PARTITION p2 VALUES LESS THAN (2015),PARTITION p3 VALUES LESS THAN (2016)
);#按年和月创建
CREATE TABLE log
(id INT UNSIGNED NOT NULL AUTO_INCREMENT,timestamp TIMESTAMP NOT NULL,user INT UNSIGNED,ip BINARY(16) NOT NULL,action VARCHAR(20) NOT NULL,PRIMARY KEY (id, timestamp)
)ENGINE = InnoDB
PARTITION BY RANGE (UNIX_TIMESTAMP(timestamp))
(PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2014-08-01 00:00:00')),PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-01 00:00:00')),PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2015-01-01 00:00:00')),PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2015-02-01 00:00:00'))
);

删除分区: ALTER TABLE log DROP PARTITION p0;

如果插入数据timestamp不在分区表范围会报错,通过IGNORE忽略错误

INSERT IGNORE INTO log(id,timestamp) VALUES (1, '2016-01-01 01:01:01'), (2, '2015-01-01 01:01:01');SELECT * FROM log;
+----+---------------------+------+------------------+--------+
| id | timestamp           | user | ip               | action |
+----+---------------------+------+------------------+--------+
|  2 | 2015-01-01 01:01:01 | NULL |                  |        |
+----+---------------------+------+------------------+--------+

通过MAXVALUE可以定义一个超出范围的最大值分区

CREATE TABLE log
(id INT UNSIGNED NOT NULL AUTO_INCREMENT,timestamp DATETIME NOT NULL,user INT UNSIGNED,ip BINARY(16) NOT NULL,action VARCHAR(20) NOT NULL,PRIMARY KEY (id, timestamp)
)ENGINE = InnoDB
PARTITION BY RANGE (YEAR(timestamp))
(PARTITION p0 VALUES LESS THAN (2013),PARTITION p1 VALUES LESS THAN (2014),PARTITION p2 VALUES LESS THAN (2015),PARTITION p3 VALUES LESS THAN (2016),PARTITION p4 VALUES LESS THAN MAXVALUE
);

LIST Partitioning类型

LIST分区在概念上类似于RANGE分区。在这两种情况下,您都需要确定一个分区表达式(一个列,或者稍微复杂一点的计算),然后使用它来确定哪些分区将包含每一行。但是,对于RANGE类型,分区是通过为每个分区分配一个值范围来完成的。对于LIST类型,我们为每个分区分配一组值。如果分区表达式可以返回一组有限的值,则通常是首选方法。

这种分区方法的一种变体LIST COLUMNS允许我们使用多列和更多数据类型。

  • 语法
PARTITION BY LIST (partitioning_expression)
(PARTITION partition_name VALUES IN (value_list),[ PARTITION partition_name VALUES IN (value_list), ... ][ PARTITION partition_name DEFAULT ]
)

RANGE COLUMNS和LIST COLUMNS分区类型

RANGE COLUMNS和LIST COLUMNS分别是RANGE和LIST的变体。对于这些分区类型,没有一个分区表达式。而是接受一个或多个列的列表。适用以下规则:

  • 该列表可以包含一个或多个列。
  • 列可以是任何integer,string,DATE和DATETIME类型。
  • 仅允许使用裸列;没有分区表达式

  • 创建分区表语法

#创建RANGE COLUMNS PARTITION
PARTITION BY RANGE COLUMNS (col1, col2, ...)
(PARTITION partition_name VALUES LESS THAN (value1, value2, ...),[ PARTITION partition_name VALUES LESS THAN (value1, value2, ...), ... ]
)
#创建LIST COLUMNS PARTITION
PARTITION BY LIST COLUMNS (partitioning_expression)
(PARTITION partition_name VALUES IN (value1, value2, ...),[ PARTITION partition_name VALUES IN (value1, value2, ...), ... ][ PARTITION partititon_name DEFAULT ]
)

分区表的限制

  • 每个表最多可以包含8192个分区(来自MariaDB 10.0.4)。在MariaDB 5.5和10.0.3之前,限制为1024。
  • 使涉及多个分区,查询不会并行化。
  • 如果存储引擎支持分区,则只能对表进行分区。
  • 所有分区必须使用相同的存储引擎。
  • 分区表不能包含外键或由外键引用。
  • 当binlog_format = ROW并且更新了分区表时,更新的运行速度可能会比非分区表的等效更新慢。
  • 分区表的分区表达式中使用的所有列都必须是该表可能具有的每个唯一键的一部分。
  • 查询缓存分区和分区修剪无效,修改一个分区将使与整个表相关的条目无效。

# 查看分区信息

SELECT
    *
FROM 
    INFORMATION_SCHEMA.PARTITIONS
WHERE 
    TABLE_SCHEMA = 'test'          # 库名
AND TABLE_NAME = 'log';    # 表名

# 常用列

PARTITION_METHOD,
    PARTITION_NAME,  
    PARTITION_EXPRESSION,  
    PARTITION_DESCRIPTION,  
    TABLE_ROWS

如:

’通过EXPLAIN PARTITION命令发现SQL优化器只需搜对应的区,不会搜索所有分区

mariadb 分区表相关推荐

  1. MariaDB 分区

    InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. segment(段) 常见的段有数据段.索引段.回滚段等, ...

  2. debian10 mariadb安装

    安装 apt-get install mariadb-server 修改配置 vim /etc/mysql/mariadb.conf.d/50-server.cnf 修改允许所有IP连接数据库 bin ...

  3. mysql/mariadb centos7 修改root用户密码及配置参数

    一.修改用户密码,以root为例 1. 知道root密码,需要修改 方法a. 登入数据库来修改 # mysql -uroot -p /*输入密码进入*/ /*第一个方式:直接编辑数据库字段*/ Mar ...

  4. centeos7安装mariadb

    1 centeos7安装mariadb yum -y install mariadb mariadb-server 2 启动mariadb服务 systemctl start mariadb.serv ...

  5. mariadb(第二章)增删改 MariaDB 数据类型

    MariaDB 数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的 常用的数据类型 整数:int, bit 小数:de ...

  6. 数据库MySQL/mariadb知识点——索引

    索引 ​ 索引是特殊数据结构:定义在查找时作为查找条件的字段,索引实现在存储引擎. 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器避免排序和使用临时表 索引可以帮助将随机I/O转 ...

  7. oracle10g索引不生效,oracle 10g分区表索引失效测试

    一.测试环境 SQL> select * from v$version; BANNER ----------------------------------------------------- ...

  8. mariadb转mysql_MariaDB/MySQL备份和恢复(二):数据导入、导出

    1.导出.导入数据 load data infile和select into outfile语句是配套的.select into outfile语句是将检索出来的数据按格式导出到文件中,数据迁移跨数据 ...

  9. upgrade lnmpa php.sh,LNMP 状态管理命令说明及Nginx、MySQL/MariaDB、PHP升级教程

    状态管理命令分 LNmp状态管理命令 和 LNmpA状态管理命令,LNMPA代表的是Linux下Nginx.MySQL.PHP.Apache这种网站服务器架构,是结合LAMP与LNMP各自的优点而产生 ...

最新文章

  1. EEMD算法的基本原理
  2. vue实现查询多条记录_sql:多表查询
  3. 阶段项目:学生信息管理系统数据库设计
  4. 推荐几个我目前在用的简历制作工具
  5. Linux下Qt使用QAudio相关类进行音频采集,使用Windows下的Matlab软件播放
  6. Tensorflow:可视化学习TensorBoard
  7. caffe的python接口学习:caffemodel中的参数及特征的抽取(转载)
  8. java生成随机验证图片的实现
  9. 什么是Meta分析异质性,怎么处理Meta分析异质性?看完这篇就够了
  10. 经典的850棋牌游戏搭建教学
  11. phpcms后台登陆页面存放地址
  12. office2007每次打开都配置进度_win7下office2007总是配置进度怎么办-解决office2007显示配置进度的方法 - 河东软件园...
  13. 【办公】关于←(Backspace)退格键和Delete键盘的区别
  14. web学习一——We简介、Tomcat、HTTP协议
  15. windows 程序员装机必备软件
  16. Win控制台下的贪吃蛇(C++)
  17. 中华英才网裁员,五成员工可拿(N+3)*月薪的离职补偿
  18. SqlServer geometry 转 geography
  19. CVPR 2020 | ACGPN: 基于图像的虚拟换装新思路
  20. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观...

热门文章

  1. 间歇控制器的工作原理,神经网络控制应用实例
  2. 智能指针(unique_ptr、shared_ptr、weak_ptr)
  3. C++学习之路二:C++
  4. 游戏项目和开源项目调研
  5. 通过旋转候选框实现任意方向的场景文本检测
  6. 查询每个学生的总成绩的各个科目的分数和姓名,按总成绩排序
  7. 自然语言处理中传统词向量表示VS深度学习语言模型(一)
  8. 深度学习中一些时而会忘的概念
  9. 将Qt QCheckBox 默认选中样式改为对号选中
  10. 如何从零打造爆款小程序