mysql分区管理 - range分区

news/2024/7/10 4:36:31 标签: mysql, table, database, server, 优化, file

        为了更好的演示range分区,首先对mysql server的启动和关闭进行说明:

一,如何启动mysqld?

        本人把mysql安装在windows环境下,安装的主目录homedir是"c:\Program Files\MySQL\MySQL Server 5.1\",启动方法非常简单:首先进入cmd命令行窗口,如下图:

       

         执行如下命令:cd  c:\Program Files\MySQL\MySQL Server 5.1\,进入mysql安装目录,可以看到bin目录,该目录是存放mysql的各种可执行文件,cd bin,进入该目录,

找到mysqld.exe的可执行文件,执行mysqld,即启动mysqld,如下图:

        

         此时,打开任务管理器 - 》进程,可以看到mysqld.exe,表示启动成功。

        

二,如何关闭mysqld?

        运行cmd,将路径切换到:c:\Program Files\MySQL\MySQL Server 5.1\bin下,用命令

        mysqladmin -u root -p shutdown

        如下图所示:

       


三,innodb_file_per_table设置

        mysql innodb 存储引擎对表空间的管理在默认情况下是使用共享表空间,即所有表的索引和数据均放在一个以ibdata1的文件中,我们可以执行下面的命令查看:

       

        可以看到对应的Value: OFF,下面我们在配置文件my.ini增加下面一行:

        #tenfy: 新添加的参数

        innodb_file_per_table=1

        然后,重新启动mysqld,此时,可以看到:

       

         那么,你也许会问,之前在innodb_file_per_table=0的时候已经创建的表,此时还是继续使用共享表空间吗?是的,如果我们不对表进行修改,之前的可以继续使用,但

         将共享表空间修改成独立表空间,除了修改innodb_file_per_table参数外,我们需要修改所有innodb的表都运行如下:

         alter table table_name engine=innodb; (tenfy:注意红色部分必须添加,否则无法生效),一旦执行完成后,我们可以在data的mytest1目录下,看到根据各个分区生成的各个.ibd后缀的文件,这些文件就是独立表空间文件,每个分区对应一个。(关于分区我们将在下面讲解)

         


四,mysql分区概述

       分区功能并不是在存储引擎层完成的,因此除了innodb支持分区外,MyISAM,NDB等均支持分区功能,而CSV,FEDERATED,MERGE则不支持分区功能。而MySQL在5.1版本时添加了对分区功能的支持。

      分区是将一个表或者索引物分解成多个更小的,更可管理的部分,而对用户访问db的应用来说,从逻辑上看,只有一个表或者一个索引(这里跟分库分表的访问不一样),但在物理上这个表或者索引可能是由许多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理。

      那么怎么判断当前数据库是否启用了分区功能呢?可以执行如下命令进行查看:

     

      或者:

     

       当前MySQL支持以下几种分区:

       1,RANGE分区:顾名思义,区间分区,行数据基于一个给定连续区间的列值放入分区。

       2,LIST分区:列表分区,与RANGE分区类似,只是LIST分区面向的是离散可列举的值。

       3,HASH分区:根据用户自定义的表达式的返回值来进行分区,返回值不能是负数。

       4,KEY分区:根据MySQL数据库提供的哈希函数进行分区。

       但是不论什么类型的分区,必须注意以下两个问题:

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

       如下:

     

      表par_tb1有唯一key,他们对应的列是col1,col2。而此时进行分区的列却是col3,因此出现1503错误,此时我们把col3加入到unique key或者用col1或者col2进行分区均

      没问题:

     

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


五,RANGE分区。

        RANGE分区是最常用的一种分区类型,它的特点主要是按照某个列连续的值进行分区,因此在分区中常常使用values less than (xxx),下面我们以具体的例子来说明。

        首先我们创建一个表,名字叫:range_par_tbl,有一个int类型的id字段,当id小于10的时候,插入第一个分区,当id小于20的时候插入第二分区。如下:

       

        此时,我们查看对应的分区表空间文件(注意:因为我们之前设置了innodb_file_per_table=1),此时启用分区后,表已经由建立分区时的各个分区ibd文件组成了,由于我们分了两个区,因此可以看到对应的两个文件:

       

        可以看到,分区对应的表空间文件命名规则为:表名#p#分区名.ibd

        接下来我们插入一些数据到对应的表里面,看看对应的记录是否真的按照id进行分区:

       

        可以看到,我们已经成功插入了id分别是9,10,15的三条记录,接下来我们来验证一下,对应的记录是真的存储在对应的分区里面。

        这里我们可以通过查询information_schema.PARTITIONS表来查看每个分区的具体信息:

       

        说明一下:database() 函数获取当前use 的database,即mytest1 database,关注用红色方框标识部分的内容,可以看到分区p0的table_rows:1,p1的table_rows:2,这就是我们之前插入的记录:9,10,15,其中9 小于10,所以放到第一个分区p0,10和15均是大于等于10且小于20,所以,这两条记录放到分区p1。

       大家也许会问,如果我插入一条记录对应的id 大于20呢?因为没有找到对应的分区,mysql会如何处理?我们继续看下面的代码:

      

       可以看到,此时mysql提示1526的错误,此时,我们可以增加一个maxvalue的分区,并且插入之前异常的记录,如下:

      

       

       range分区常常用于按照日期列的分区,这样非常方便我们进行按照时间或者年份的维度进行分区管理,这在订单类表中非常常见,下面我们以订单表为例子进行说明。

      

        此时我们按照某种条件进行搜索,看看是否在指定的分区中搜索:

       

         此时,可以看到,查询优化器只需要去搜索p2008这个分区,而不会搜索所有的分区。


         需要注意的是,分区函数的选择非常重要,如果选择不合适,可能导致查询优化器无法在指定的分区里面进行查找,有人设计了一个表sales,目的是希望按年月进行  

         range分区。

        

          然后插入一些数据后,进行查询,如下所示:

         

          可以看到查询优化器仍然对分区p201001,p201002,p201003均进行搜索,产生的原因在于分区函数:Range分区函数,查询优化器只能对YEAR(),TO_DAYS(),TO_SECONDS(),UNIX_TIMESTAMP()这些函数进行优化选择,因此上述需要选择TO_DAYS()分区函数进行分区。

        

        

  


 

    

     

 

       

        





http://www.niftyadmin.cn/n/1737673.html

相关文章

Unified Call Management (UCM)统一通话管理组织结构摘要

Unified Call Management (UCM)统一通话管理组织结构摘要 <script></script> ...[CALL CENTER] 1.call history2.voip call3.vedio call4.general call setting [GENERAL CALL SETTING]1.caller id2.call waiting3.call divert4.call barring5.black list6.auto re…

CPHS规范

CPHS规范 <script>function StorePage(){ddocument;td.selection?(d.selection.type!None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyitwindow.open(http://www.365key.com/storeit.aspx?tescape(d.title)&uescape(d.locat…

新的一代通信系统PCN结构模型

PCN的结构模型 PCN的技术支柱有3个&#xff0c;一是数字无线入网技术&#xff1b;二是扩展频谱通信技术&#xff1b;三是以光纤为基础的智能通信网。 数字无线入网技术通过GSM、D-AMPS等系统的研究&#xff0c;各项关键技术均已解决。扩展频谱通信技术目前引起人们最大兴趣的是…

MySQL分区管理 - LIST分区

在上一篇文章中&#xff0c;我们通过例子重点介绍了基于某列&#xff08;若存在主键或者唯一键&#xff0c;则该列必须是这些键的子集&#xff09;建立区间的分区&#xff0c;区间分区主要用于按某个范围且具有连续值的列。而本章介绍的list分区&#xff0c;顾名思义&#xff0…

主叫线路识别限制CLIR

CLIR 英文缩写: CLIR (Calling Line Identification Restriction)   中文译名: 主叫线路识别限制   分 类:   解 释: 如果主叫用户不同意在被叫用户话机上显示自己的电话号码&#xff0c;可以向电信部门申请这种主叫线路识别限制&#xff08;CLIR&#xff09;的业务功…

LVS中前置机LB的容错机制

LVS前端的调度器有可能成为系统的单一失效点&#xff08;Single Point of Failure&#xff09;。一般来说&#xff0c;调度器的可靠性较高&#xff0c;因为调度器上运行的程序较少而且大部分程序早已经遍历过&#xff0c;但我们不能排除硬件老化、网络线路或者人为误操作等主要…

手机开机死机,MTK芯片组不开机维修

MTK芯片组不开机维修 手机开机的工作条件&#xff0c;手机要正常持续开机&#xff0c;需具备以下四个条件&#xff1a;一是电源IC工作正常&#xff1b;二是时钟工作正常&#xff0c;三是逻辑电路正常&#xff0c;四是软件工作正常。1、 电源IC工作正常&#xff08;1&#xff0…

MTK死机短信代码

MTK死机短信代码  近日收到朋友短信&#xff0c;收到打开闪屏&#xff0c;死机&#xff0c;本人的是MTK机&#xff0c;上网查找&#xff0c;得到发下内容&#xff1a;根据IMY格式语法,你收到的短信就是个闪光震动代码:(ledoff ledon , backoff backon , vibeon , 0)[开关LED(闪…