`

mysql分区认知

 
阅读更多

MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用

 

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。

 

Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。

 

Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

 

List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。

 

Composite(复合模式) –以上模式的组合使用 

 

 

二,分区能做什么

 

   逻辑数据分割

   提高单一的写和读应用速度

   提高分区范围读查询的速度

   分割数据能够有多个不同的物理文件路径

   高效的保存历史数据

   一个表上的约束检查

   不同的主从服务器分区策略,例如master按Hash分区,slave按range分区

 

 

三,分区的限制

 

   只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列,例如create_time字段是datetime类型,可通过to_days等函数将其字段值转换成数字类型

 

   最大分区数目不能超过1024

 

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

 

   不支持外键

 

   不支持全文索引(fulltext)

 

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

 

四,什么时候使用分区

 

   海量数据表

 

   历史表快速的查询,可以采用ARCHIVE+PARTITION的方式。

 

   数据表索引大于服务器有效内存

 

   对于大表,特别是索引远远大于服务器有效内存时,可以不用索引,此时分区效率会更有效

 

 

五,分区具体操作:

 

情况一:

创建good_2表,并且按照the_date字段的日期按年份来分区,由于the_date字段是整形类型,所以没法使用时间函数year来做分区,但可以通过div除法运算得出年份

CREATE TABLE `good_2` (

  `id` int(11) NOT NULL DEFAULT '0',

  `name` char(20) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',

  `the_date` int(8) DEFAULT '0'

) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by range ( the_date div 100 )(

partition g2_2013 less than (2014),

partition g2_2014 less than (2015),

partition g2_2015 less than (2016)

);

 

 

情况二:

创建good_2表,并且按照create_time字段按年份来分区,timestamp类型的字段无法进行分区,所以得用datetime类型, to_days函数将日期折算成天数

CREATE TABLE `good_2` (

  `id` int(11) NOT NULL DEFAULT '0',

  `name` char(20) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `create_time` datetime,

  `the_date` int(8) DEFAULT '0'

) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by range ( to_days(create_time) )(

partition g2_2013 values less than (to_days('2014-01-01')),

partition g2_2014 values less than (to_days('2015-01-01')),

partition g2_2015 values less than (to_days('2016-01-01'))

);

 

 

情况三:

对已有的表进行分区,使用alter table的语句,如下:


//时间字段为日期格式,例如datetime格式,分区需要用to_days

alter table good3 partition by range( to_days(create_time) )(

partition g2_2013 values less than (to_days('2014-01-01')),

partition g2_2014 values less than (to_days('2015-01-01')),

partition g2_2015 values less than (to_days('2016-01-01')),

partition g21_3 values less than MAXVALUE

);

 


//时间字段为时间戳,例如timestamp格式,需要使用UNIX_TIMESTAMP方法,而不是to_days
alter table `good_20180902_1` partition by range(UNIX_TIMESTAMP(`create_time`))(
partition g21_1 values less than (UNIX_TIMESTAMP('2018-07-01 00:00:00')),
partition g21_2 values less than (UNIX_TIMESTAMP('2018-08-01 00:00:00')),

partition g21_3 values less than MAXVALUE
);

 

 

情况四:

删除表中的指定分区,如下:

ALTER TABLE 表名 DROP PARTITION 分区名;  例如:alter table good_2 drop partition g2_2015;

 

 

情况五:

追加分区,如下:

alter table good_2 add partition (   

partition g2_2015 values less than (to_days('2016-01-01'))

partition g2_2016 values less than (to_days('2017-01-01'))

);  

 

 

情况六:

如果表中存在主键字段(primary key),需要把创建分区的字段包含在主键字段中,也就是说需要将分区字段和主键字段作为复合主键

例如存在表me:

CREATE TABLE `me` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` char(20) DEFAULT NULL,

  the_date int(8) not null default 0

  PRIMARY KEY (`id`)

);

如果需要对the_date字段做分区,需要先将它与主键id做复合主键,操作步骤如下:

先删除自增:alter table me modify id int(11) not null;  

删除旧主键:alter table me drop primary key;

创建复合主键:alter table me add primary key(id, the_date);

最后再创建分区

 

 

查看表分区的情况(主要是记录数):

SELECT    

        partition_name part,     

        partition_expression expr,     

        partition_description descr,     

        table_rows     

FROM    

        INFORMATION_SCHEMA.partitions     

WHERE    

        TABLE_SCHEMA = schema()    

        AND TABLE_NAME='good_2'; 

 

 

查看查询语句使用分区的情况:

explain partitions select * from good_2 where the_date between 20140102 and 20140103;

 

相关的分区测试结论:

分区和未分区占用文件空间大致相同 (数据和索引文件)

如果查询语句中有未建立索引字段,分区时间远远优于未分区时间

如果查询语句中字段建立了索引,分区和未分区的差别缩小,分区略优于未分区。

对于大数据量,建议使用分区功能。

去除不必要的字段

 

根据手册,增加myisam_max_sort_file_size 会增加分区性能

 

 

分享到:
评论

相关推荐

    MYSQL优化实施方案

    - **潜在的风险**:优化手段本身就带有一定的风险,有时候这些风险甚至超出了我们的认知和预见。 - **技术的双刃剑**:任何技术都能解决一个问题,但同时也有可能引入新的问题。 - **可控的风险**:在优化过程中,...

    Mysql教程,内容详细

    这部分内容对于初学者来说至关重要,能够帮助他们建立起对数据库管理系统的初步认知,并具备基本的数据库操作能力。 第二部分:MySQL进阶 在进阶部分,教程将深入探讨事务处理、备份与恢复、性能优化、安全性设置等...

    逐步精通MySQL数据库(教学光盘)

    通过这些章节的学习,你将能够逐步建立起对MySQL数据库系统的全面认知,无论是进行日常的数据管理,还是开发复杂的数据库应用,都将游刃有余。这个教学光盘的资源将是你学习过程中宝贵的辅助材料,它提供了实践操作...

    Java毕业设计:基于springboot的成人教育教务系统设计于实现(源码+文档+ppt+录像演示).zip

    Java、spring boot、MySQL 系统实现 本成人教育教务管理系统的首页设计理念以简洁为主要风格,简洁的页面设计和简洁的功能分区可以让用户有更好的用户体验。通过简单的功能分区更好的实现功能操作的展示,更好的...

    基于springboot的成人教育教务系统设计于实现.zip

    Java、spring boot、MySQL 系统实现 本成人教育教务管理系统的首页设计理念以简洁为主要风格,简洁的页面设计和简洁的功能分区可以让用户有更好的用户体验。通过简单的功能分区更好的实现功能操作的展示,更好的...

    Hadoop平台搭建与应用课程标准.pdf

    课程内容和要求覆盖了从大数据概念到具体工具使用的各个环节,如Ubuntu操作系统的基本操作、Hadoop的三种模式安装配置、MySQL数据库的配置、Hive的分区表和桶表创建、Zookeeper的znode操作、HBase的shell操作、Sqoop...

    大数据实训方案教程文件.pdf

    6. **Hive**:Hive是基于Hadoop的数据仓库工具,学习Hive的安装、DDL(数据定义语言)和DML(数据操作语言),如创建表、数据导入和导出,以及使用MySQL元数据库,理解分区表和用户自定义函数(UDF)的概念,以及倒...

    企业信息管理系统代码

    数据库设计涉及概念设计(ER图)、逻辑设计(SQL语句创建表结构)和物理设计(考虑索引、分区等优化策略)。例如,可能会有"员工表"、"部门表"等,它们之间的关系通过外键关联。 在Java SE开发中,常用的数据库连接...

    PHP100视频教程2012版LINUX 视频教程解压码[36-49讲]

    ### Linux基础认知 #### 第36讲:Linux认识 这一讲主要介绍Linux的历史背景、发展现状及其与Unix的关系,同时也会对比Windows操作系统,突出Linux的开放性、安全性、稳定性和成本优势,使学习者对Linux有一个初步而...

    Linux/Unix系统自学教程

    通过这两本书的学习,你可以建立起对Linux/Unix系统的全面认知,从基础操作到高级管理,从理论到实践,都能游刃有余。 此外,自我学习过程中,建议动手操作,通过虚拟机或实际的硬件环境实践所学知识,加深理解。...

    2011百度笔试题

    - **Oracle**:适合大型企业应用,支持高级功能如分区、实时数据仓库等。 #### 38. PV操作示例 - **生产者消费者问题**:使用P、V操作同步生产者和消费者的线程执行。 #### 39. 笔试自我评价 - **表现**:对自己...

    nosql分布式数据库期末考试题.docx

    - **关系数据库**: MySQL、SQL Server 和 Oracle 均属于关系数据库,它们采用 SQL 作为标准查询语言,支持 ACID 特性(原子性、一致性、隔离性和持久性)。 - **非关系数据库**: 指的是不采用表格形式来组织数据的...

Global site tag (gtag.js) - Google Analytics