MySQL 分区知识点(二)
前言:
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 分区知识点(二)的更多相关文章
- MySQL 分区知识点(一 )
前言: 查了下资料,关于 MySQL 分区的博文讲的详细的比较少,也不全,只好在官网去翻译英文文章看了.大体整理了一下记录起来: MySQL 分区类型: 1.RANGE 分区: // 这种类型的分区基 ...
- MySQL 分区知识点(三)
前言: MySQL 分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表, 从 information_schema.INNODB_SYS_TABLES 系统表可以看到每个分 ...
- mysql分区表之二:MySQL的表的四种分区类型介绍
一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- mysql常见知识点总结
mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...
- mysql分区及实例演示
一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...
- mysql分区功能详细介绍,以及实例
一,什么是数据库分区 前段时间写过一篇关于mysql分表的 的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下 ...
- MySQL分区技术 (一)
4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...
- Mysql 分区详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt120 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.m ...
- mysql分区方案的研究
笔者觉得,分库分表确实好的.但是,动不动搞分库分表,太麻烦了.分库分表虽然是提高数据库性能的常规办法,但是太麻烦了.所以,尝试研究mysql的分区到底如何. 之前写过一篇文章,http://www.c ...
随机推荐
- docker介绍和简单使用
docker介绍 docker 为什么会有docker出现? 一款产品从开发到上线,从操作系统到运行环境,再到应用配置,作为开发+运维直接的协作我们需要关心很多东西,这也是互联网公司不得 不面对问题, ...
- Json模块的详细介绍(序列化)
什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然 ...
- android开发 软键盘出现后 防止EditText控件遮挡 总体平移UI
在EditText控件接近底部的情况下 软键盘弹出后会把获得焦点的EditText控件遮挡 无法看到输入信息 防止这种情况发生 就须要设置AndroidManifest.xml的属性 前面的xml信 ...
- 小计---pandas读取带有中文文件名或者包含中文内容的文件
python2下: # -*- coding: utf-8 -*- import pandas as pd mydata = pd.read_csv(u"例子.csv") #前面加 ...
- mysql数据库补充知识4 数据备份和pymysql模块
一 介绍 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键 二 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如W ...
- vim之可视化
参考文档:http://blog.csdn.net/ii1245712564/article/details/46960387 先梳理关键知识,方便查阅 v(小v):进入可视化 V(大V):进入可视行 ...
- yii2弹出层
bootstrap http://getbootstrap.com/javascript/#modals https://github.com/lichunqiang/yii2-sweet-submi ...
- 【Tech】Mac上安装MAMP打开本地网页
不知道为什么实验室老是用些奇葩的东西,这次是madserve,主要是用来统计移动端广告点击率的,基于PHP/MYSQL实现. 昨天很快在Windows上搭好一个xampp,并用它建立了一个virtua ...
- 系统封装接口层 cmsis_os
在这个实时操作系统泛滥的年代,有这么一个系统封装接口层还是蛮有必要的.前些时间偶然间在STM32最新的固件库中就发现了这个系统封装接口,当时就把自己所用的系统进行封装.直到最近KEIL5.0发现其中所 ...
- 【鸟哥的Linux私房菜】笔记
操作系统核心的功能! 驱动程序与操作系统的关系 2. [计算机组成之组件] 3.CPU实际要处理的数据完全来自于主存储器,这是一个很重要的概念! 4.CPU是整个计算机系统最重要的部分,那么目前世界上 ...