mysql表分区使用及详细介绍

mysql表分区使用及详细介绍,第1张

一、分区概念

分区是将一个表分成多个区块进行 *** 作和保存,从而降低每次 *** 作的数据,提高性能。而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是独立的对象,可以进行独立处理。

二、分区作用

1.可以逻辑数据分割,分割数据能够有多个不同的物理文件路径。

2.可以存储更多的数据,突破系统单个文件最大限制。

3.提升性能,提高每个分区的读写速度,提高分区范围查询的速度。

4.可以通过删除相关分区来快速删除数据

5.通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能。

6.涉及到例如SUM()、COUNT()这样聚合函数的查询,可以很容易的进行并行处理。

7.可以备份和恢复独立的分区,这对大数据量很有好处。

三、分区能支持的引擎

MySQL支持大部分引擎创建分区,入MyISAM、InnoDB等;不支持MERGE和CSV等来创建分区。同一个分区表中的所有分区必须是同一个存储引擎。值得注意的是,在MySQL8版本中,MyISAM表引擎不支持分区。

四、确认MySQL支持分区

从MySQL5.1开始引入分区功能,可以如下方式查看是否支持:

老版本用:SHOW VARIABLES LIKE '%partition%'

新版本用:show plugins

五、分区类型

1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

例如,可以将一个表通过年份划分成两个分区,2001 -2010年、2011-2020。

2. LIST分区:类似于RANGE分区,LIST是列值匹配一个离散值集合中的某个值来进行选择。

比如 根据字段 把值为1、3、5的放到一起,2、4、6的另外放到一起 等等...

3. HASH分区:基于用户定义的表达式的返回值来进行选择分区,该表达式使用将要插入到表中的这些行的列值来进行计算,这个函数必须产生非负整数值。

通过HASH运算来进行分区,分布的比较均匀

4. KEY分区:类似于按HASH分区,由MySQL服务器提供其自身的哈希函数。

按照KEY进行分区类似于按照HASH分区

六、分区创建注意事项

1. 如果表中存在primary key 或者 unique key 时,分区的列必须是paimary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集

2. 如果表中不存在任何的paimary key或者unique key,则可以指定任何一个列作为分区列

3. 5.5版本前的RANGE、LIST、HASH分区要求分区键必须是int;MySQL5.5及以上,支持非整形的RANGE和LIST分区,即:range columns 和 list columns (可以用字符串来进行分区)。

七、分区命名

1. 分区的名字基本上遵循其他MySQL 标识符应当遵循的原则,例如用于表和数据库名字的标识符。应当注意的是, 分区的名字是不区分大小写的 。

2. 无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。

八、 创建分区

1. RANGE分区:

CREATE TABLE `test01` (

`dayid` int(11) DEFAULT NULL,

`mac` varchar(32) NOT NULL DEFAULT '',

`dtype` varchar(50) NOT NULL DEFAULT ''

) ENGINE=InnoDB DEFAULT CHARSET=utf8

/*!50100 PARTITION BY LIST (dayid)

(PARTITION p20171205 VALUES IN (20171205) ENGINE = InnoDB,

PARTITION p20171204 VALUES IN (20171204) ENGINE = InnoDB,

PARTITION p20171206 VALUES IN (20171206) ENGINE = InnoDB,

PARTITION p20171207 VALUES IN (20171207) ENGINE = InnoDB) */

解读:以上为 uuid小于5时放到p0分区下,uuid大于5且小于10放到p1分区下,uuid大于10且小于15放到p2分区下,uuid大于15 一直到最大值的存在p3分区下

2. LIST分区:

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

)

)

PARTITION BY List (uuid) (

PARTITION p0 VALUES in (1,2,3,5),

PARTITION p1 VALUES in (7,9,10),

PARTITION p2 VALUES in (11,15)

)

)

解读:以上为uuid 等于1/2/3/5时放到p0分区,7/9/10放到p1分区,11/15放到p2分区。当时用insert into时 如果uuid的值不存在p0/p1/p2分区时,则会插入失败而报错。

3. HASH分区:

HASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE分区和LIST分区中必须明确指定一个指定的列值或列值集合以指定应该保存在哪个分区中。而在HASH分区中,MySQL会自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量,如:

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

))

PARTITION BY HASH (uuid) (

PARTITIONS 3

))

解读:MySQL自动创建3个分区,在执行insert into时,根据插入的uuid通过算法来自动分配区间。

注意:

(1) 由于每次插入、更新、删除一行,这个表达式都要计算一次,这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。

(2) 最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑了在分区范围上的“修剪”。也就是说,表达式值和它所基于的列的值变化越接近,就越能有效地使用该表达式来进行HASH分区。

3.1:线性HASH分区

线性HASH分区在“PARTITION BY”子句中添加“LINEAR”关键字。

线性HASH分区的有点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有及其大量数据的表。它的缺点在于各个分区间数据的分布不大可能均衡。

4. KEY分区

类似于HASH分区,HASH分区允许用户自定义的表达式,而KEY分区则不允许使用用户自定义的表达式;HASH分区只支持整数分区,KEY分区支持除了blob和text类型之外的其他数据类型分区。

与HASH分区不同,创建KEY分区表的时候,可以不指定分区键,默认会选择使用主键或唯一键作为分区键,没有主键或唯一键,就必须指定分区键。

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

))

PARTITION BY LINEAR Key (uuid)

PARTITIONS 3

解读:根据分区键来进行分区

5. 子分区

子分区是分区表中,每个分区的再次分割,适合保存非常大量的数据。

CREATE TABLE tbl_test (

registerTime Date

))

PARTITION BY GANGE(YEAR(registerTime))

SUBPARTITION BY HASH (TO_DAYS(registerTime))

SUBPARTITIONS 2

(

PARTITION p0 VALUES LESS THAN (2017),

PARTITION p1 VALUES LESS THAN (2020),

PARTITION p2 VALUES LESS THAN MAXVALUE

)

解读:主分区使用RANGE按照年来进行分区,有3个RANGE分区。这3个分区中又被进一步分成了2个子分区,实际上,整个表被分成了3 * 2 = 6个分区。每个子分区按照天进行HASH分区。小于2017的放在一起,2017-2020的放在一起,大于2020的放在一起。

注意:

(1) 在MySQL5.1中,对于已经通过RANGE或LIST分区了的表在进行子分区是可能的。子分区既可以使用HASH分区,也可以使用KEY分区。这也被称为复合分区。

(2) 每个分区必须有相同数量的子分区。

(3) 如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。

(4) 每个SUBPARTITION子句必须包含(至少)子分区的一个名字。

(5) 在每个子分区内,子分区的名字必须是惟一的,目前在整个表中,也要保持唯一。例如:

PARTITION BY RANGE(YEAR(registerTime))

SUBPARTITION BY HASH(TO_DAYS(registerTime))

(

PARTITION p0 VALUES LESS THAN (2017) (

SUBPARTITION s0,

SUBPARTITION s1

),

PARTITION p1 VALUES LESS THAN (2020) (

SUBPARTITION s2,

SUBPARTITION s3

),

PARTITION p2 VALUES LESS THAN MAXVALUE (

SUBPARTITION s4,

SUBPARTITION s5

)

)

子分区可以用于特别大的表,可以在多个磁盘间分配数据和索引。例如:

SUBPARTITION s0

DATA DIRECTORY = '/disk0/data'

INDEX DIRECTORY = '/disk0/idx'

,

,

SUBPARTITION s1

DATA DIRECTORY = '/disk1/data'

INDEX DIRECTORY = '/disk1/idx'

九、MySQL分区处理NULL值的方式

MySQL中的分区禁止空值NULL上没有进行处理,无论它是一个列值还是一个用户定义表达式的值,一般而言,在这种情况下MySQL把NULL视为0。如果你希望回避这种做法,你应该在设计表时声明列“NOT NULL”。

十、分区管理概述

可以对分区进行添加、删除、重新定义、合并或拆分等管理 *** 作。

① RANGE和LIST分区的管理

1. 删除分区语句如:alter table tbl_test drop partition p0

注意:

(1) 当删除了一个分区,也同时删除了该分区中所有的数据。

(2) 可以通过show create table tbl_test来查看新的创建表的语句。

(3) 如果是LIST分区的话,删除的数据不能新增进来,因为这些行的列值包含在已经删除了的分区的值列表中。

2. 添加分区语句如:alter table tbl_test add partition(partition p3 values less than(50))

注意:

(1) 对于RANGE分区的表,只可以添加新的分区到分区列表的最高端。

(2) 对于LIST分区的表,不能添加已经包含在现有分区值列表中的任意值。

3. 如果希望能不丢失数据的条件下重新定义分区,可以使用如下语句:

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition_definitions)

(1) 拆分分区如:

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition s0 values less than(5),partition s1 values less than(10))

或者如:

ALTER TABLE tbl_name REORGANIZE PARTITION p0 INTO(partition s0 values in(1,2,3), partition s1 values in(4,5))

(2) 合并分区如:ALTER TABLE tbl_name REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5))

4. 删除所有分区,但保留数据,形式:ALTER TABLE tbl_name remove partitioning

② HASH和KEY分区的管理

1. 减少分区数量语句如:ALTER TABLE tbl_name COALESCE PARTITION 2

2. 添加分区数量语句如:ALTER TABLE tbl_name add PARTITION partitions 2

③ 其他分区管理语句

1. 重建分区 :类似于先删除保存在分区中的所有记录,然后重新插入它们,可用于整理分区碎片。如:ALTER table tbl_name REBUILD PARTITION p2,p3

2. 优化分区 :如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB或TEXT类型的列)做了许多修改,可以使用 ALTER TABLE tbl_name OPTIMIZE PARTITION来收回没有使用的空间,并整理分区数据文件的碎片。如:ALTER TABLE tbl_name OPTIMIZE PARTITION p2,p3

3. 分析分区 :读取并保存分区的键分布,如:ALTER TABLE tbl_name ANALYZE PARTITION p2,p3

4. 检查分区 :检查分区中的数据或索引是否已经被破坏,如:ALTER TABLE tbl_name CHECK PARTITION p2,p3

5. 修补分区 :修补被破坏的分区,如:ALTER TABLE tbl_name REPAIR PARTITION p2,p3

十、查看分区信息

1. 查看分区信息:select * from information_schema.partitions where table_schema='arch1' and table_name = 'tbl_test' G

2. 查看分区上的数据:select * from tbl_test partition(p0)

3. 查看MySQL会 *** 作的分区:explain partitions select * from tbl_test where uuid = 2

十一、 局限性

1. 最大分区数目不能超过1024,一般建议对单表的分区数不要超过50个。

2. 如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内。

3. 不支持外键。

4. 不支持全文索引,对分区表的分区键创建索引,那么这个索引也将被分区。

5. 按日期进行分区很合适,因为很多日期函数可以用。但是对字符串来说合适的分区函数不太多。

6. 只有RANGE和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。

7. 临时表不能被分区。

8. 分区表对于单条记录的查询没有优势。

9. 要注意选择分区的成本,没插入一行数据都需要按照表达式筛选插入的分区。

10. 分区字段尽量不要可以为null

sql小于等于日期大于等于日期_SQL中级第四关:复杂查询_weixin_3979370...

sql运行顺序:1.先运行子查询2.每个查询语句里运行顺序: ①先运行from,where,group by,having②再运行select子句③最后运行order by,limit 偶尔使用:打车——子查询 (返回) 多行(子查询) (返回) 单一值(标准子查询)in,any...

继续访问

MySQL查询小于或大于当天日期的数据_花小疯的博客_mysql查询...

MySQL查询小于或大于当天日期的数据 MySQL的有三个关于日期时间的函数,分别是NOW()、CURDATE()、CURTIME() NOW()函数返回当前的日期和时间。 例如:2021-6-10 11:30:04 CURDATE() 函数返回当前的日期。例如:2021-6-10...

继续访问

MySQL查询小于当天日期的数据

这里要用到MySQL的三个函数,分别是NOW()、CURDATE()、CURTIME() NOW()函数返回当前的日期和时间。 例如:2020-6-29 13:27:07 CURDATE() 函数返回当前的日期。例如:2020-6-29 CURTIME() 函数返回当前的时间。例如:13:27:07 我们想要查询小于或者大于当天日期的数据只需要这样: SELECT * FROM 表名 WHERE 字段名 >NOW() 以此类推。 ...

继续访问

Mysql 查询小于当前时间数据

小于当前时间(年月日格式) where 数据库数据<CURDATE() 小于当前时间(年月日 时分秒格式) where 数据库数据<now()

继续访问

sql 查询小于今天大于前七天中间所有日期_从零学会SQL:求职面试题_we...

1)查询姓“猴”的学生名单 --查询姓“猴”的学生名单 select学号,姓名,出生日期,性别 fromstudent where姓名like'猴%'2)查询姓名中最后一个字是“猴”的学生名单 -- 查询姓名中最后一个字是“猴”的学生名单 ...

继续访问

SQL Server中日期问题的解决

在MS SQL Server 中,只有DATETIME型,日期和时间是合在一起的,比如2004-12-19 23:12:20。 有的时候,在SQL语句中,只要求取日期的话,的确比较麻烦,但也有以下的方法,归纳一下......

MySQL查询小于或大于当天日期的数据

MySQL的三个函数,分别是NOW()、CURDATE()、CURTIME() NOW()函数返回当前的日期和时间。 例如:2020-6-29 13:27:07 CURDATE() 函数返回当前的日期。例如:2020-6-29 CURTIME() 函数返回当前的时间。例如:13:27:07 我们想要查询小于或者大于当天日期的数据只需要这样: SELECT * FROM 表名 WHERE 字段名 >NOW() ...

继续访问

mysql 查询小于当前时间的数据_MySQL查询数据(五)

在本教程中,您将学习如何使用MySQLSELECT语句从表或视图查询数据。MySQL SELECT语句简介使用SELECT语句从表或视图获取数据。表由行和列组成,如电子表格。 通常,我们只希望看到子集行,列的子集或两者的组合。SELECT语句的结果称为结果集,它是行列表,每行由相同数量的列组成。请参阅示例数据库(yiibaidb)中的以下employees表的结构。它有8列:员工人数,姓氏,名字,...

继续访问

mysqlsql语句 小于当前时间10秒_一文看懂mysql时间函数now()、current_timestamp() 和sysdate()...

概述今天主要介绍一下mysql 中 时间函数now() current_timestamp() 和 sysdate() 以及三者之间的比较。now()、current_timestamp() 和 sysdate()在mysql中有三个时间函数用来获取当前的时间,分别是now()、current_timestamp() 和 sysdate()这三个函数都可以获得当前的时间,例如 select now...

继续访问

mysql sql语句查询小于系统时间的数据_JavaScript学习笔记(二十四)-- MYSQL基础 *** 作...

MYSQLmysql 是一个数据库的名字和 php 合作的比较好的数据库之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端接下来就聊聊使用 php *** 作数据库MySQL 是最流行的关系型数据库管理系统(非关系型数据库简略介绍) 关系数据库管理系统(Relational Database Management System)的特点 数据以表格的形式出现 每行为各种记录名...

继续访问

热门推荐 sql——查询大于、小于某个日期的写法

oracle日期时间的加减法

加法 select sysdate,add_months(sysdate,12) from dual--加1年 select sysdate,add_months(sysdate,1) from dual--加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from...

继续访问

使用Hive查询mysql经典50道题

使用Hive查询mysql经典50题一、mysql经典50道题二、使用hive查询50题 一、mysql经典50道题 学生表 Student student_id student_name birth sex 1 赵雷 1990-01-01 男 2 钱电 1990-12-21 男 3 孙风 1990-05-20 男 4 李云 1990-08-06 男 5 周梅 1991-12-01 女 6 吴兰 1992-03-01 女 7 郑竹 1989-07-01 女 8 王

继续访问

SQL语句计算某个时间与当前时间的差距

我要做一个30分钟未付款自动取消订单的需求,这个时候我需要判断订单创建时间与当前时间差距是否大于30,so 用到了sql语句中的TIMESTAMPDIFF(单位,开始时间,结束时间)函数 其中单位可以为: 1、YEAR 年 2、QUARTER 季度 3、MONTH 月 4、WEEk 星期 5、DAY 天 6、HOUR 小时 7、MINUTE 分钟 8、SECOND 秒 9、FRAC_SECOND 毫秒 案例一:计算时间差几分钟: SELECT TIMESTAMPDIFF( MINUTE

继续访问

sql语句练习50题(Mysql版)

–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程编号,分数 测试数据 --建表 --学生表 CREATE TABLE `Student`( `s...

继续访问

sql小于某个日期_SQL练习补充与复盘(未完)

上一篇文章使我第一次真正用SQL做分析,在分析的过程中我发现,虽然很多想法能够用SQL语句表达出来,也不再老是受到Excel和编程语言使用习惯不同的烦恼,但是这门看起来简单的语言其实并不简单。作为一个当时学数据库原理考了快90分、搭了一个小数据库的人,我以为我学的还不错,但是真的用到实际分析上,我发现我还是会抓瞎:脑子:从A表里用子查询查个子集A1,然后连上另一个子查询结果A2再按X分个组查两个字...

继续访问

mysqlsql语句 小于当前时间10秒_JavaScript中条件语句的使用

什么是条件语句JavaScript 语言中,条件语句(if 语句)常用于基于不同条件执行不同的动作。简单来讲就是判断给出的某个条件是否是正确的,如果条件正确要如何做,条件错误要如何做。举一个例子,例如现在有一个变量 age,给定一个条件语句为 “age是否大于18”,如果大于18 则可以玩游戏,否则不可以玩游戏。var age = 20if(age >18){ console....

继续访问

mysql模糊查询语句_Mysql查询语句练习

一. 练习用表展示StudentCourseScoreteacher二.练习1.select查询展示查询语句及结果-- 查询学生表 -- 查询学生表所有信息 select * from student-- 查询姓名,性别并自定义别名(as的用法) select 姓名 as s_name,性别 as '人类性别' from student-- 查找不重复姓名(distinct用法) sel...

继续访问

最新发布 MySQL判断日期小于当前日期

代码 SELECT * FROM book WHERE returnDate<CURDATE()

继续访问

sql小于等于日期大于等于日期_SQL数据分析 - 2 简单查询

一. 基本的查询语句通过使用“select * from 【表名】”的语句结构查询出表中全部列2. 通过使用关键词【distinct】可删除重复数据3. SQL 基本子句:a. select 后面跟要查询的结果b. from 后面跟要查询的表c. where子句 后面跟查询条件(运算符,字符串模糊查询……)需要注意SQL的运行顺序和书写顺序是不同的。可以理解为先执行b,再执行c,最后执行a。二、常...

继续访问

【MySql】查询:简单查询

一、基本查询语句 基本语法:select <列名1>,<列名2>from <表名>-- 简单查询 select 姓名,出生日期 from studentselect * from student#*号代表所有字段 -- 列名别名as select 姓名 as name,出生日期 from studen...

MySQL的基础 *** 作三

1.

查询每个部门的平均工资,要求平均工资大于2000 selectavg(sal) agfromempgroupbydeptnohavingag>2000

2.

查询商品表中每个分类的平均单价,要求平均单 价小于100 selectcategory_id,avg(price) agfromt_itemgroupbycategory_idhavingag<100

3.

查询emp表中工资在1000-3000之间的员工,每个部门的编号,工资总和,平均工资,过


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6124905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存