前言:

  MySQL 5.1+ 版本就开始支持分区功能了。

  分区本质上就是在物理文件层面划分了多个物理子表来支撑,或者说是一组底层表的句柄对象的封装。

  对于分区表的请求,都是通过句柄对象转化成对存储引擎的接口调用。

  从底层的文件系统就可以看出来,使用了 # 分割的命名表文件,就是分区表;

  ls /home/mysql/data/mysql/  # 可以查看到

  

  

  什么场景使用分区才能起到非常大的作用:

  1、表非常大以至于无法全部都放在内存中;(被挤出内存,MySQL 的缓存不起作用了)

  2、分区表的数据容易维护的。

  3、分区表的数据可以分布在不同物理设备上的;

  4、如果需要,可以备份和恢复独立的分区的;

一、分区表原理

  SELECT 查询:

    当查询一个分区表的时候,分区层先打开并锁住所有的底层表,

    优化器先判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据。

    break;

  INSERT 操作:
  DELTE 操作:

    当写入一条记录时,分区层先打开并锁住所有底层表,然后确定哪个分区接收这条记录,再写入。

    break;

  UPDATE 操作:

    当更新一条记录时,分区层先锁底层表,然后寻找哪个分区,然后取数据更新。

    更新完成后再看数据应该放在哪个分区,如果跨分区则删除老分区、写入新分区;

  // 所谓的锁住底层表,也是针对不同存储引擎而来的;

二、如何选择性分区

  分区技巧:

  1、可以根据键值进行分区,来减少 InnoDB 的互斥量竞争;

  2、使用数学模函数来进行分区,然后将数据轮询放入不同的分区。

    如,针对日期做模 7 的运算,或者简单使用周几的函数,进行分区;

  3、假设表有一个自增主键列 ID,希望根据时间将最近的热点数据集中存放,

    这种情况可以采用这样的分区表达式来实现:HASH(ID DIV 100000),这将

    为 100 万数据建立一个分区。

  在数据量超大的时候,B-Tree 索引就无法起作用了,除非是索引覆盖查询,否则数据库服务器需要根据索引扫描的结果回表,

  查询所有符合条件的记录,如果数据量巨大,这将产生大量随机 I/O,数据库响应时间将大到不可接受的程度,另外索引维护成本也非常高;   

  分区策略:

  1、全量扫描数据,不要任何索引。

    可以使用简单的分区方式存放表,不要任何索引,根据分区的规则大致定位需要的数据位置。

    只要能够使用 WHERE 条件,将需要的数据限制在少数分区中,则效率很高的。

    当然,也需要做一些简单的运算保证查询的响应时间能够满意需求。

    此策略适用于以正常的方式访问大量数据的时候。

  2、索引数据,并分离热点。

    如果数据有明显的 “热点”,而且除了这部分数据,其他数据很少被访问,那么可以独立出一个分区,

    让这个分区的数据能够有机会缓存在内存中。

  分区的坑:

  1、NULL 值会使分区过滤无效;

  2、分区列和索引不匹配;

    如果定义的索引列和分区列不匹配,会导致查询无法进行分区的过滤。

  3、打开并锁住所有底层表的成本可能很高;

  4、维护分区的成本可能会很高;

MySQL 分区知识点(二)的更多相关文章

  1. MySQL 分区知识点(一 )

    前言: 查了下资料,关于 MySQL 分区的博文讲的详细的比较少,也不全,只好在官网去翻译英文文章看了.大体整理了一下记录起来: MySQL 分区类型: 1.RANGE 分区: // 这种类型的分区基 ...

  2. MySQL 分区知识点(三)

    前言: MySQL 分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表, 从 information_schema.INNODB_SYS_TABLES 系统表可以看到每个分 ...

  3. mysql分区表之二:MySQL的表的四种分区类型介绍

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...

  4. mysql常见知识点总结

    mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...

  5. mysql分区及实例演示

    一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...

  6. mysql分区功能详细介绍,以及实例

    一,什么是数据库分区 前段时间写过一篇关于mysql分表的 的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下 ...

  7. MySQL分区技术 (一)

    4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...

  8. Mysql 分区详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt120 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.m ...

  9. mysql分区方案的研究

    笔者觉得,分库分表确实好的.但是,动不动搞分库分表,太麻烦了.分库分表虽然是提高数据库性能的常规办法,但是太麻烦了.所以,尝试研究mysql的分区到底如何. 之前写过一篇文章,http://www.c ...

随机推荐

  1. Android sdk manager加载缓慢或加载不出来

    1.打开android sdk manager 2.打开tool->options,如图所示 3.将Proxy Settings 里的HTTP Proxy Server和HTTP Proxy P ...

  2. Scalability, Availability & Stability Patterns

    https://blog.csdn.net/ajian005/article/details/6191814   一 自我有要求的读者应该提出问题:(研习:掌握层次:)能力级别:不会(了解)——领会( ...

  3. VC引用静态库

    对于路径的设置: Tools->Options->Directory中设置的Lib路径,是给VC环境设置的, 所以只要是这个VC打开的项目,都会包含这些路径. Project->Se ...

  4. java FileUtils 文件工具类

    package com.sicdt.library.core.utils; import java.io.BufferedInputStream; import java.io.File; impor ...

  5. 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!

    准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...

  6. 【HackerRank】Cut the tree

    题目链接:Cut the tree 题解:题目要求求一条边,去掉这条边后得到的两棵树的节点和差的绝对值最小. 暴力求解会超时. 如果我们可以求出以每个节点为根的子树的节点之和,那么当我们去掉一条边(a ...

  7. JS 操作复制剪切粘贴

    测试了很多次之后,虽然有点细碎的突破,但还是想说,麻辣隔壁... 众所周知使用 oncut/oncopy/onpaste 监听剪切板,采用 window.clipboardData 并不是适用于大多浏 ...

  8. vRA7 Business error “Untrusted certificate chain”

    报错截图: 服务无法注册 第一步:登录vRB 5480页面,取消到vRA的注册 第二部:SSH登录到VRB中,查看bio-ssl.keystore.password. cat /shared/cata ...

  9. poj 1273 ---&&--- hdu 1532 最大流模板

    最近在换代码布局,因为发现代码布局也可以引起一个人的兴趣这个方法是算法Edmonds-Karp 最短增广路算法,不知道的话可以百度一下,基于Ford-Fulkerson算法的基础上延伸的 其实我不是很 ...

  10. python进阶03

    进程线程不管哪门语言都是一块可以被重视的方向,下面一起学习学习python中的进程,线程 1.进程线程区别 通俗解释:一个程序QQ的运行就是一个进程运行:QQ中打开多个页面互不影响可以同时操作的每个页 ...