iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL学习笔记(14):分区
  • 517
分享到

MySQL学习笔记(14):分区

MySQL学习笔记(14):分区 2015-11-15 01:11:47 517人浏览 猪猪侠
摘要

本文更新于2019-06-30,使用Mysql 5.7,操作系统为Deepin 15.4。 目录分区类型Range分区List分区Columns分区Hash分区Key分区子分区分区管理Range分区和List分区的分区管理Hash

MySQL学习笔记(14):分区

本文更新于2019-06-30,使用Mysql 5.7,操作系统为Deepin 15.4。

目录

  • 分区类型
    • Range分区
    • List分区
    • Columns分区
    • Hash分区
    • Key分区
    • 子分区
  • 分区管理
    • Range分区和List分区的分区管理
    • Hash分区和Key分区的分区管理

分区类型

可以使用SHOW PLUGINS查看是否安装了分区插件

mysql创建分区表支持使用大部分存储引擎,但不支持使用MERGE或CSV存储引擎。同一个分区表的所有分区必须使用同一种存储引擎。

Mysql分区作用于整个表的所有数据和索引,其索引一定是本地LOCAL索引。

无论那种分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键包含分区键。

分区表中的分区名不区分大小写。

可以通过查询infORMation_schema.PARTITIONS得知分区中的行数,来间接确定记录是插入到那一个分区中的:

SELECT PARTITION_NAME, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = dbname AND TABLE_NAME = tablename

Range分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY RANGE [COLUMNS] (partitionkey[, ...]) (
PARTITION partitionname VALUES LESS THAN (value)|MAXVALUE
[, ...]
)

如不使用COLUMNS,则Range分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。如使用COLUMNS,则为Range Columns分区,分区键可为非INT类型,可为多列分区,不能为表达式。

Range分区的区间必须连续且不能互相重叠,区间为左闭右开区间。每个分区都是按顺序进行定义的,从最低到最高。

分区键的值如果是NULL则会被当作最小值来处理。

List分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY LIST [COLUMNS] (partitionkey[, ...]) (
PARTITION partitionname VALUES IN (value[, ...])
[, ...]
)

如不使用COLUMNS,List分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。如使用COLUMNS,则为List Columns分区,分区键可为非INT类型,可为多列分区,不能为表达式。

List分区的声明不必按照特定的顺序。

分区键的值如果是NULL则必须出现在分区定义的枚举列表中。

Columns分区

Columns分区可分为Range Columns分区和List Columns分区,其分区键都支持整数、日期时间、字符串数据类型。

  • 所有整数类型,即TINYINTSMALLINTMEDIUMINTINTBIGINT,不支持其他数值类型。
  • 日期时间类型DATEDATETIME。分区日期处理支持的函数有YEAR()TO_DAYS()TO_SECONDS()
  • 字符串类型CHARVARCHARBINARYVARBINARY,不支持[*]TEXT[*]BLOB

Columns分区可使用一列或多列作为分区键,即支持多列分区,不支持表达式作为分区键。其分区键是基于元组的比较,即多列排序

Hash分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY [LINEAR] HASH(partitionkey)
PARTITIONS count

MySQL支持两种Hash分区,常规Hash分区和线性Hash分区。常规Hash分区使用的是取模算法,线性Hash分区使用的是一个线性的2的幂的运算法则。常规Hash分区在分区管理(增加、删除、合并、拆分分区)时代价较大,线程Hash分区在分区管理时能处理得更迅速,但各个分区之间数据分布不太均匀。常规Hash分区将记录保存到分区编号为MOD(partitionkey, count)的分区中,线性Hash分区保存的分区编号按照如下规则计算。当线性Hash分区的个数为2的幂的时候,其和常规Hash分区的分区结果是一致的。

  1. 找到下一个大于等于count的2的幂V = Power(2, Ceiling(Log(2, count)))V有可能大于count
  2. 设置N = partitionkey & (V - 1)。由上一步得,V - 1为一个所有位都为1的整数,运算结果N共有V种可能(0V - 1)。
  3. N > count时,设置V = Ceiling(V / 2),由第一步得知该值肯定小于count且为一个2的幂。使用新的V设置N = N & (V - 1)即为分区编号。

Hash分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。

分区键的值如果是NULL则会将其当作零值处理。

Key分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY [LINEAR] KEY ([partitionkey[, ...]])
PARTITIONS count

Key分区的分区键可为除[*]TEXT[*]BLOB类型以外的一列或多列,不能为表达式。如未指定分区键,则使用主键作为分区键;若无主键,则选择非空唯一键作为分区键。MySQL使用服务器的HASH函数计算列的散列值。

分区键的值如果是NULL则会将其当作零值处理。

Key分区表不能执行ALTER TABLE DROP PRIMARY KEY来删除主键,否则会返回错误:Field in list of fields for partition function not found in table。

Key分区使用LINEAR和Hash分区有相同的作用。

子分区

Range分区和List分区可再进行子分区(复合分区),子分区可以使用Hash分区或Key分区。

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]
PARTITION BY RANGE|LIST [COLUMNS] (partitionkey1[, ...])
SUBPARTITION BY HASH|KEY (partitionkey2[, ...])
SUBPARTITIONS count
(
PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
[, ...]
)

PARTITION子句的VALUES根据分区是Range分区还是List分区填写(下同)。

分区管理

Range分区和List分区的分区管理

删除分区,会同时删除分区中的数据:

ALTER TABLE tablename
DROP PARTITION partitionname

增加分区,Range分区只能添加分区至分区列表最大一端:

ALTER TABLE tablename
ADD PARTITION (
PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
)

重定义分区,不会丢失原有数据,可以用来拆分一个分区为多个分区,也可以用来合并多个相邻分区(指定义语句相邻)为一个分区或多个分区,同时重定义的分区范围必需与原分区相同:

ALTER TABLE tablename
REORGANIZE PARTITION partitionname1[, ...] INTO (
PARTITION partitionname2 VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}
[, ...]
)

如不使用相邻分区重定义,则会返回错误:When reorganizing a set of partitions they must be in consecutive order。

Hash分区和Key分区的分区管理

合并分区:

ALTER TABLE tablename
COALESCE PARTITION count

不能通过加大count值来增加分区的数量,否则会返回错误:Cannot remove all partitions, use DROP TABLE instead!。

增加分区,为新增count个分区,而不是增加到count个分区:

ALTER TABLE tablename
ADD PARTITION PARTITIONS count
您可能感兴趣的文档:

--结束END--

本文标题: MySQL学习笔记(14):分区

本文链接: https://www.lsjlt.com/news/7085.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL学习笔记(14):分区
    本文更新于2019-06-30,使用MySQL 5.7,操作系统为Deepin 15.4。 目录分区类型Range分区List分区Columns分区Hash分区Key分区子分区分区管理Range分区和List分区的分区管理Hash...
    99+
    2015-11-15
    MySQL学习笔记(14):分区
  • 2018-3-14 Linux学习笔记
    Nginx访问日志的格式是在主配置文件中定义的. vim /usr/local/nginx/conf/nginx.conf //搜索log_format 日志字段含义:$remote_addr 客户端IP(公网IP...
    99+
    2023-01-31
    学习笔记 Linux
  • MySQL学习笔记
    作者: Grey 原文地址:MySQL学习笔记 说明 注:本文中的SQL语句如果用到了特定方言,都是基于MySQL数据库。 关于DDL DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了...
    99+
    2015-01-17
    MySQL学习笔记
  • MySQL 学习笔记
    😀😀😀创作不易,各位看官点赞收藏. 文章目录 MySQL 学习笔记1、`DQL` 查询语句1.1、基本查询1.2、函数查询1.2.1、单行函数1...
    99+
    2023-10-01
    mysql 学习 笔记
  • mysql学习笔记之explain分析
    mysql explain功能中展示各种信息的解释: id:优化器选定的执行计划中查询的序列号。 select_type:所用的查询类型,主要由以下这集中查询类型。   . DEPENDENT UNION:子查询中的UN...
    99+
    2017-08-03
    mysql学习笔记之explain分析
  • mysql学习笔记之profiling分析
    要想有画一条query,就需要清楚这条query的性能瓶颈到底在哪里,mysql的profiler是一个使用非常方便的查询诊断分析工具,通过该工具可以获取一条查询在整个执行过程中多种资源的消耗情况,例如内存消耗、I/O消耗和CPU消耗等。 ...
    99+
    2017-03-12
    mysql学习笔记之profiling分析
  • MySQL 学习笔记 (一)
    1.InnoDB and Online DDL ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; https://dev.mysql.c...
    99+
    2016-12-04
    MySQL 学习笔记 (一)
  • MySQL 学习笔记(五)
    mysqldump 与 --set-gtid-purged 设置 (1)  mysqldump The mysqldump client utility performs logical backups, producing a set ...
    99+
    2022-01-27
    MySQL 学习笔记(五)
  • MySQL学习笔记-day01
    1、数据库概述及数据准备 1.1、SQL概述 SQL,全称Structured Query Language,SQL用来和数据库打交道,完成和数据库的通信,SQL是一套标准。(90%以上的SQL都是通用的)。 SQL:结构化语言,是一门标...
    99+
    2017-10-15
    MySQL学习笔记-day01
  • MySQL学习笔记-day03
    1、约束 1.1、唯一性约束(unique) 唯一性约束修饰的字段具有唯一性,不能重复。但可以为NULL。 案例:给某一列添加unique drop table if exists t_user; create table t_...
    99+
    2020-11-18
    MySQL学习笔记-day03
  • 【MongoDB学习笔记14】MongoDB的查询:find基础
    MongoDB中使用find来进行查询,返回一个集合中的文档的子集;返回文档集合blog中的所有文档:> db.post.find()    { "_...
    99+
    2022-10-18
  • MySQL学习笔记 初涉MySQL
    1.在Linux下安装MySQL# yum -y install mysql mysql-server mysql-devel &nbs...
    99+
    2022-10-18
  • MySQL学习笔记(17):MySQL Utilities
    本文更新于2020-04-05,使用MySQL 5.7,操作系统为Deepin 15.4。 目录安装分类mysqldbcompare——数据库比较工具mysqldbcopy——数据库复制工具mysqldiff——数据库对象定义比较...
    99+
    2015-05-06
    MySQL学习笔记(17):MySQL Utilities
  • 超全MySQL学习笔记
    目录MyISAM和InnoDB性能下降SQL慢的原因:Mysql执行顺序SQLJoin索引索引的优劣1.优势2.劣势索引分类创建删除查看mysql索引结构那些情况建索引哪些情况不要建...
    99+
    2022-11-12
  • MySQL学习笔记(3):SQL
    本文章更新于2020-06-14,使用MySQL 5.7,操作系统为Deepin 15.9。 目录DDL语句创建数据库删除数据库修改数据库创建表删除表修改表创建索引删除索引创建视图修改视图删除视图存储过程和函数创建事件修改事件删除...
    99+
    2022-04-25
    MySQL学习笔记(3):SQL
  • 学习笔记:MYSQL查询
    前言:之前花费两天晚上看了一遍Mysql必知必会,没想到后面效果太差。不如跟着网课视频敲一遍和完成练习题目(练习题没写注释就不记录了),再记下笔记。 一、基本的查询select语句 语法: select 查询列表 from 表名...
    99+
    2015-12-27
    学习笔记:MYSQL查询
  • mysql学习笔记二 DQL
    -- 查询编号为1004的学生的姓名和生日 select name,birthday from student where id=1004; -- 查询年龄大于18的学生信息 select...
    99+
    2018-07-25
    mysql学习笔记二 DQL
  • MongoDB学习笔记:分片
    本文更新于2022-01-08,使用MongoDB 4.4.5。 目录单台服务器下创建分片多台服务器下创建分片重新启动并连接到分片 单台服务器下创建分片 确保/data/db目录存在且当前系统用户有读写权限。例如(需根据实际情况设置权...
    99+
    2021-03-30
    MongoDB学习笔记:分片
  • 尚硅谷MySQL学习笔记
    MySQL笔记目录 一、MySQL数据库基础篇大纲 1.数据库概述与MySQL安装篇 第01章:数据库概述第02章:MySQL环境搭建 2.SQL之SELECT使用篇 ...
    99+
    2023-09-08
    mysql 数据库 sql
  • Mysql命令学习笔记(一)
    一、安装/卸载Mysql数据库    #安装Mysql数据库    D:\mysql\bin>mysqld --inst...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作