博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 分区
阅读量:5897 次
发布时间:2019-06-19

本文共 2995 字,大约阅读时间需要 9 分钟。

1. SHOW CREATE TABLE 
可以查看创建分区表的CREATE语句 

2. SHOW TABLE STATUS 
可以查看表是否为分区表 

3. 查看INFORMATION_SCHEMA.PARTITIONS表 
SELECT 
  partition_name part,  
  partition_expression expr,  
  partition_description descr,  
  table_rows  
FROM 
  INFORMATION_SCHEMA.partitions  
WHERE 
  TABLE_SCHEMA = schema()  
  AND TABLE_NAME='employees';  
可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等重要信息 

4. EXPLAIN PARTITIONS (SELECT语句) 
查看select语句怎样使用分区

 

 

分区知识:

MySQL分区技术是用来减轻海量数据带来的负担,解决数据库性能下降问题的一种方式,其他的方式还有建立索引,大表拆小表等等。
  MySQL分区按照分区的参考方式来分有
RANGE分区、LIST分区、HASH分区、KEY分区。本文对这几种分区方式进行了详细的介绍,并且给出了简单的示例,文章简洁明了,对于想要初步了解MySQL分区技术的同学来说是很不错的参考材料。 


一、背景介绍

 

  当 MySQL中一个表的总记录数超过了1000万,会出现性能的大幅度下降吗?答案是肯定的。但性能下降的比率由系统的架构、应用程序、数据库索引、服务器硬件等多种因素而定。数据库多达上亿的数据量,分表之后的单个表也已经突破千万,那么单个表的更新等均影响着系统的运行效率。甚至是一条简单的SQL都有可能压垮整个数据库,如整个表对某个字段的排序操作等。

  目前,针对海量数据的优化主要有2种方法:大表拆小表的方式、SQL语句的优化

  SQL语句的优化:可以通过增加索引等来调整,但是数据量的增大将会导致索引的维护代价增大。在此不详述,建议大家参考相应的《High Performance MySQL等书籍。

  大表拆小表的方式主要有两种:

  1,垂直分表:

  

    图1,垂直分区示意图

 

  对于垂直分表,它将一个N1+N2个字段的表Tab拆分成N1字段的子表Tab1(N2+1)字段的子表Tab2;其中子表Tab2包含了关于子表Tab1的主键信息,否则两个表的关联关系就会丢失。当然垂直分表会带来程序端SQL的修改,若是应用程序已经应用很长的一段时间,然后程序的升级将是耗时而且易出错的,即升级的代价将会很大。

  2,水平分表:

  

    图2,水平分区示意图

 

  水平分区技术将一个表拆成多个表,比较常用的方式是将表中的记录按照某种Hash算法进行拆分,简单的拆分方法如取模方式。同样,这种分区方法也必须对前端的应用程序中的SQL进行修改方可使用。而且对于一个SQL,它可能会修改两个表,那么你必须得写成2SQL语句从而可以完成一个逻辑的事务,使得程序的判断逻辑越来越复杂,这样也会导致程序的维护代价高,也就失去了采用数据库的优势。因此,分区技术可以有力地避免如上的弊端,成为解决海量数据存储的有力方法。


二、MySQL分区介绍

 

  MySQL的分区技术不同与之前的分表技术,它与水平分表有点类似,但是它是在逻辑层进行的水平分表,对与应用程序而言它还是一张表。MySQL5.15种分区类型:

 

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

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

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

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

  1,RANGE分区

  对于RANGE分区,举个例子:

  例1:假定你创建了一个如下的表,该表保存有20家音像店的职员记录,这20家音像店的编号从120如果你想将其分成4个小分区,那么你可以采用RANGE分区,创建的数据库表如下:

  

    图3,RANGE分区实例1

 

  在这个例子,key是一个整型的数据,那是否对于其它类型的字段就无法作为key呢?答案是否定的,例子2说明这种情况。

  例2:假定你创建了一个如下的表,该表保存有20家音像店的职员记录,这20家音像店的编号从120。你想把不同时期离职的员工进行分别存储,那么你可以将日期字段separated(即离职时间)作为一个key,创建的SQL语句如下:

  

    图4,RANGE分区实例2

 

  这样你就可以对一个日期类型的字段调用mysql的日期函数YEAR()转换为一种整数类型,从而可以作为RANGE分区的key。这个时候你可以看到,分区后的物理文件是相对独立的: 

  

    图5,RANGE分区后物理文件

 

  可知,每个分区有自己独立的数据文件和索引文件,这是为什么你对某一个查询,它只会访问它需要访问的数据块,而不访问根本不是结果的物理块,从而可以大大提高系统的效率。

  2,LIST分区

  LIST分区与RANGE分区有类似的地方,举个与例1类似的例子如下:

  例3:假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从120而这20个音像店,分布在4个有经销权的地区,如下表所示:

  

    图6,LIST分区实例3

  那么你可以采用如下的LIST分区语句创建数据表:

  

    图7,LIST分区实例SQL语句

 

  同样,它在物理文件上也会标识不同的分区:

  

    图8,LIST分区后物理文件

 

  3,HASH分区

  HASH分区主要用来确保数据在预先确定数目的分区中平均分布。它可以基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。

  例4:假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从120。你想把不同时期加入的员工进行分别存储,那么你可以将日期字段hired(即离职时间)作为一个key,创建的SQL语句如下:

  

    图9,HASH分区实例4

 

  那么要插入一个在2005-09-15日入职的员工E1,那么按照取模函数会将其放置到第2分区中:

  MOD(YEAR(‘2005-09-01’), 4)= MOD(2005,4)= 1 //即第2分区

  4,KEY分区

  与HASH分区类似,但它的key可以不是整数类型,如字符串等类型的字段。MySQL 簇(Cluster)使用函数MD5()来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()一样的运算法则。

  5,不同分区技术的对比

  如上分别列出了不同的分区技术,接下来进行对比,如下表所示:

  

    图10,不同分区技术对比

转载地址:http://nexsx.baihongyu.com/

你可能感兴趣的文章
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
Thread类源码解读(1)——如何创建和启动线程
查看>>
Bootstrap清除浮动的实现原理
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
javascript事件响应
查看>>
通过script标签实现JSONP跨域调用
查看>>
用jQuery实现Ajax
查看>>
上传图片预览
查看>>
vim编辑器
查看>>
程序设计的一些原理
查看>>
iTerm的安装以及配置
查看>>
《社交网站界面设计(原书第2版)》——1.7 反模式的重要性
查看>>
2016上半年DDoS攻击报告:DDoS攻击的规模和攻击频率都在不断攀升
查看>>