`
王之子
  • 浏览: 111849 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MySQL5.5 分区简述

 
阅读更多

    随着数据库应用规模的扩展,需要管理的数据规模也越来越大,普通的数据库查询优化机制在某些情况下已不能再满足性能的要求了。利用数据库分区技术,可以有效地减少 I/O 的数量,提升系统的查询性能。
 

1.什么是分区?

    数据库分区是一种物理数据库设计技术,DBA 和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果,但其主要目的是在特定的 SQL 操作中减少数据库读/写的总量以缩减响应的时间。

    分区(Partitioning)是数据库优化的一种方式。简单来说就是将同一数据表中的记录通过特定的算法进行分离,分别保存在不同的数据表中,甚至可以部署在不同的物理磁盘上,分散对同一张数据表的操作,提高访问的速度。

    举个例子:db_blog 数据库存储了用户发表的博客内容,主要数据都在tb1_posts表中,它的结构如下所示:



 


     我们按照 user_id%10 的规则将它分以下为10个数据表:

     tb1_posts_0
     tb1_posts_1
     tb1_posts_2
     tb1_posts_3
     tb1_posts_4
     tb1_posts_5
     tb1_posts_6
     tb1_posts_7
     tb1_posts_8
     tb1_posts_9

     这样,当tb1_posts表的记录数目是上百万级时,它实际上是分布在10个分区表中,每一张表的记录数保持在相对较少的数量,有利于减少查询的时间,避免对同一张表的频繁读写,从而为数据库减少不必要的开销。



 
数据表分布在不同的物理硬盘上(水平分区)


    分区主要有两种形式:水平分区与垂直分区。
 
    (1)水平分区
     水平分区(Horizontal Partitioning)是对表的行进行分区,通过这样的方式使得不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(一个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。例如,一个包含10年发票记录的表可以分为10个不同的分区,每个分区都包含其中一年的记录(这里具体使用的分区方式一定要通过某个属性列来分割,譬如这里使用的列是年份)。
 
    (2)垂直分区
     垂直分区(Vertical Partitioning)是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。例如,一个包含了大 TEXT 和 BLOB 列的表,因为这些TEXT和BLOB列不经常被访问,所以这时就要把这些不经常使用的 TEXT 和 BLOB 列划分到另一个分区,以保证它们在数据库相关的同时还能提高访问速度。

2.分区类型


  • RANGE分区(RANGE Partitioning)
 

    这种算法是指按照分区索引字段的范围进行分区,比如我们可以将user_id为1~10000的记录存储在一个分区中,而将10001~20000的用户存储在另一个分区中,以此类推。

 
    再引用官方的一个例子:创建 RANGE 分区表的语法
 
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
    
    其中:p0、p1、p2、p3 表示分区的名称,MAXVALUE 表示最大的可能的整数值。


  • List分区(LIST Partitioning)
 
    这种算法将对分区索引字段的每个可能的结果创建一个分区映射关系,这个映射关系将会非常庞大。
 

    假设有20个音像店,分布在4个有经销权的地区,如下表所示:

 
地区 商店ID 号
北区 3, 5, 6, 9, 17
东区 1, 2, 10, 11, 19, 20
西区 4, 12, 13, 14, 18
中心区 7, 8, 15, 16
  
    用 List 分区语法如下:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),--数据和索引放在默认的位置

    PARTITION pEast VALUES IN (1,2,10,11,19,20)
DATA DIRECTORY = '/disk0/data'
   INDEX DIRECTORY = '/disk0/idx',--把数据和索引放在不同的磁盘上
    PARTITION pWest VALUES IN (4,12,13,14,18)
DATA DIRECTORY = '/disk1/data'
   INDEX DIRECTORY = '/disk1/idx',--当然,也可以是不同的物理硬盘上,如果有多个物理硬盘的话
    PARTITION pCentral VALUES IN (7,8,15,16)
DATA DIRECTORY = '/disk2/data'
   INDEX DIRECTORY = '/disk2/idx'
 );
  • Hash分区(Hash Partitioning

   刚才我们通过 user_id%10 来实现分区便是这种算法,它非常容易实现。

   例如,下面的语句创建了一个使用基于"store_id"列进行哈希处理的表,该表被分成了4个分区:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;
    它有4个分区,MySQL通过用户函数(HASH(store_id))返回的结果的模数来确定使用哪个编号(N)的分区来保存每条记录。在上例中,N 是这样计算的:


MOD(7,4)  -- 7表示的是 store_id
=  MOD(7,4) -- 取模运算
=  3 -- 表示第4个分区

   哈希函数适用只对单个表列进行计算,并且它的值随列值进行一致地增大或减小,表达式值和它所基于的列的值变化越接近,MySQL就可以越有效地使用该表达式来进行HASH分区。
   换句话说,如果列值与表达式值之比的曲线图越接近由等式"y=nx"(其中n为非零的常数)描绘出的直线,则该表达式越适合于哈希。这是因为,表达式的非线性越严重,分区中数据产生非均衡分布的趋势也将越严重。

   LINEAR HASH分区(LINEAR HASH Partitioning

   线性哈希功能,它与常规哈希的区别在于,线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规哈希使用的是求哈希函数值的模数。

   按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(terabytes)数据的表。它的缺点在于,与使用常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。


CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 4;




    通过以上可知,分区通过设置任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。用户所选择的、实现数据分割的规则被称为分区函数。在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数。函数根据用户指定的分区类型来选择,把用户提供的表达式的值作为参数。该表达式可以是一个整数列值,或一个作用在一个或多个列值上并返回一个整数的函数。这个表达式的值传递给分区函数,分区函数返回一个表示那个特定记录应该保存在哪个分区的序号。




3.分区的约束和限制


    如果分区表使用的是 InnoDB  存储引擎,那么 DATA DIRECTORY (数据目录)和 INDEX DIRECTORY (索引目录)配置选项无效。
       在 Windows 平台下,不管使用的是 InnoDB 存储引擎还是 MyISAM 存储引擎, DATA DIRECTORY (数据目录)和 INDEX DIRECTORY (索引目录)配置选项也是无效的。

   很多时候,使用分区就不要再使用主键,否则可能影响性能。

   只能通过 int 类型的字段或者返回 int 类型的表达式来分区。

    每个表最多 1024 个分区,不可能无限制扩展分区,而且过度使用分区往往会消耗大量系统内存。

   采用分区的表不支持外键,相关的约束逻辑必须通过程序来实现。

   分区后,可能会造成索引失效,需要验证分区可行性。

  • 大小: 34.8 KB
  • 大小: 30.8 KB
分享到:
评论

相关推荐

    简述MySQL InnoDB存储引擎

    在 MySQL 5.5 及之后的版本中,InnoDB 成为了默认的存储引擎,这表明它在 MySQL 社区中的重要地位。 1. **InnoDB 的特性** - **事务支持**:InnoDB 支持ACID(原子性、一致性、隔离性、持久性)事务,提供了一种...

    Ubuntu权威指南(2/2)

    2.4.5 磁盘分区 40 2.4.6 网络 40 2.4.7 连接到服务器 41 2.4.8 搜索文件 41 2.4.9 最近的文档 42 2.5 系统菜单 42 2.5.1 首选项 42 2.5.2 系统管理 45 2.5.3 锁住屏幕 51 2.5.4 注销 51 2.5.5 关机 51 2.6 使用移动...

    Ubuntu权威指南(1/2)

    2.4.5 磁盘分区 40 2.4.6 网络 40 2.4.7 连接到服务器 41 2.4.8 搜索文件 41 2.4.9 最近的文档 42 2.5 系统菜单 42 2.5.1 首选项 42 2.5.2 系统管理 45 2.5.3 锁住屏幕 51 2.5.4 注销 51 2.5.5 关机 51 2.6 使用移动...

    基于ARM架构服务器部署docker-compose

    基于arm64版本的docker-compose文件

    附件3-4:台区智能融合终端全性能试验增值税发票开具确认单.docx

    台区终端电科院送检文档

    埃夫特机器人Ethernet IP 通讯配置步骤

    埃夫特机器人Ethernet IP 通讯配置步骤

    rv320e机器人重型关节行星摆线减速传动装置研发.rar

    rv320e机器人重型关节行星摆线减速传动装置研发

    气缸驱动爬杆机器人的设计().zip

    气缸驱动爬杆机器人的设计().zip

    软件工程中期答辩1234567

    56tgyhujikolp[

    基于OpenCV的数字身份验证系统:人脸检测、训练与识别的Python实现

    内容概要:本文档提供了基于OpenCV的数字身份验证系统的Python代码示例,涵盖人脸检测、训练和识别三个主要功能模块。首先,通过调用OpenCV的CascadeClassifier加载预训练模型,实现人脸检测并采集多张人脸图像用于后续训练。接着,利用LBPH(局部二值模式直方图)算法对面部特征进行训练,生成训练数据集。最后,在实际应用中,系统能够实时捕获视频流,对比已有的人脸数据库完成身份验证。此外,还介绍了必要的环境配置如依赖库安装、文件路径设置以及摄像头兼容性的处理。 适合人群:对计算机视觉感兴趣的研发人员,尤其是希望深入了解OpenCV库及其在人脸识别领域的应用者。 使用场景及目标:适用于构建安全认证系统的企业或机构,旨在提高出入管理的安全性和效率。具体应用场景包括但不限于门禁控制系统、考勤打卡机等。 其他说明:文中提供的代码片段仅为基本框架,可根据实际需求调整参数优化性能。同时提醒开发者注意隐私保护法规,合法合规地收集和使用个人生物识别信息。

    Java并发编程面试题详解:123道经典题目解析与实战技巧

    内容概要:本文档详细介绍了Java并发编程的核心知识点,涵盖基础知识、并发理论、线程池、并发容器、并发队列及并发工具类等方面。主要内容包括但不限于:多线程应用场景及其优劣、线程与进程的区别、线程同步方法、线程池的工作原理及配置、常见并发容器的特点及使用场景、并发队列的分类及常用队列介绍、以及常用的并发工具类。文档旨在帮助开发者深入理解和掌握Java并发编程的关键技术和最佳实践。 适合人群:具备一定Java编程经验的研发人员,尤其是希望深入了解并发编程机制、提高多线程应用性能的中级及以上水平的Java开发者。 使用场景及目标:①帮助开发者理解并发编程的基本概念和技术细节;②指导开发者在实际项目中合理运用多线程和并发工具,提升应用程序的性能和可靠性;③为准备Java技术面试的候选人提供全面的知识参考。 其他说明:文档内容详尽,适合用作深度学习资料或面试复习指南。建议读者结合实际编码练习,逐步掌握并发编程技巧。文中提到的多种并发工具类和容器,均附有具体的应用场景和注意事项,有助于读者更好地应用于实际工作中。

    个人健康与健身追踪数据集,包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,适用于数据分析、机器学习

    这个数据集包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,是个人健康与健身追踪的一部分。 该数据集非常适合用于以下实践: 数据清洗:现实世界中的数据往往包含缺失值、异常值或不一致之处。例如,某些天的步数可能缺失,或者存在不切实际的数值(如10,000小时的睡眠或负数的卡路里消耗)。通过处理这些问题,可以学习如何清理和准备数据进行分析。 探索性分析(发现日常习惯中的模式):可以通过分析找出日常生活中的模式和趋势,比如一周中哪一天人们通常走得最多,或是睡眠时间与活跃程度之间的关系等。 构建可视化图表(步数趋势、睡眠与活动对比图):将数据转换成易于理解的图形形式,有助于更直观地看出数据的趋势和关联。例如,绘制步数随时间变化的趋势图,或是比较睡眠时间和活动量之间的关系图。 数据叙事(将个人风格的追踪转化为可操作的见解):通过讲述故事的方式,把从数据中得到的洞察变成具体的行动建议。例如,根据某人特定时间段内的活动水平和睡眠质量,提供改善健康状况的具体建议。

    《基于YOLOv8的港口船舶靠泊角度偏差预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    nginx 访问访问日志按天切割 shell脚本

    nginx

    《基于YOLOv8的核废料运输容器密封性检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的农业无人机播种深度监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    uniapp知识付费(流量主)demo

    模拟知识付费小程序,可流量主运营模式

    java高并发之分片上传

    什么是普通上传 调用接口一次性完成一个文件的上传。 普通上传2个缺点 文件无法续传,比如上传了一个比较大的文件,中间突然断掉了,需要重来 大文件上传太慢 解决方案 分片上传

    英二2010-2021阅读理解 Part A 题干单词(补).pdf

    英二2010-2021阅读理解 Part A 题干单词(补).pdf

    2023-04-06-项目笔记 - 第四百五十五阶段 - 4.4.2.453全局变量的作用域-453 -2025.04-01

    2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01

Global site tag (gtag.js) - Google Analytics