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

mysql高级特性之数据分区

阅读更多

mysql高级特性
  1 以存储引擎的角度分析,分区表和物理表没有区别。是按照一定的规则将数据分别存储的逻辑设计。器底层是由多个物理字表组成。
  
  2 分区的原理
     分区表由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们可以直接访问各个分区。存储引擎管理分区的各个底层
	 表和管理普通表一样(所有底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个完全相同的索引。
	 从存储引擎角度来看,底层表和一个普通表没有任何的不同,存储引擎也无需知道这是一个普通表还是一个分区表。
	 在分区表中 索引已经失去作用,添加索引只会增加服务器的负担。如果发现某一些索引仍会起作用那也只是短暂的
	 回光返照。随着数据规模的增加,这些索引必然会成为负担。
	 
  3 分区表的类型
    1 根据范围进行分区
	2 根据实践间隔分区
	3 	mysql还支持键值、哈希、列表分区,这其中还支持子分区。
	4 还可以根据数学模函数来进行分区。
	

  4 如何使用分区表
    在分区表中,索引在空间和维护上的消耗巨大,尤其是当表非常大的时候,特别不希望使用索引,即使真的使用索引,你会
	发现数据并不是按照想要的方式聚集的,而且会有大量的碎片产生,最终会导致一个查询产生成千上万的随机IO,应用
	程序也随之僵死。有时候也可以通过一两个索引解决一些问题,不过多数情况下,索引不会有任何作用,这时候有两条路可选:
	让所有的查询都只在数据表上做顺序扫描,或者将数据表和索引全部都缓存在内存中。
	
	这里需要再陈述一遍,在数据量超大的时候,B-Tree索引就无法起作用了。除非是索引覆盖查询,否则数据库服务器
	需要根据索引扫描的结果回表查询所有符合条件的记录,如果数据量巨大,这将产生大量随机IO,随之,数据库的响应时间
	将大到不可接受。另外,索引维护(磁盘空间、IO操作)的代价也非常高。
	
	这正是分区所要做的事情。理解分区时还可以将其当做索引的最初形态,以待价非常小的方式定位到需要的数据在那一片区域。
	在这片区域中,你可以做顺序扫描,可以建索引,还可以将数据都缓存到内存等。因为分区无需额外的数据结构记录每个
	分区有哪些数据,分区不需要精确定位每条数据的位置,也就无需额外的数据结构,只需要一个简单的表达式就可以表达每个分区
	存放的是什么数据。
	
	为了保证大数据量的可扩展性,一般有下面两个策略:
	
	全量扫描数据,不需要任何索引。
	 可以使用简单的分区方式存放表,不需要任何索引,根据分区的规则大致定位需要的数据位置。只要能够使用where条件,将需要的数据限制在少数分区
	 中,则效率是非常高的。使用该策略假设不用将数据完全放入到内存中,同时还假设需要的数据全都在磁盘上,因为内存相对很小
	 数据很快会被挤出内存,所以缓存起不了任何作用。这个策略适用于以正常的方式访问大量数据的时候。
	 
	索引数据,并分离热点。
	  如果某部分数据有明显的热点,而且除了这部分数据,其他数据很少被访问到,那么可以将这部分热点数据单独放在一个分区中,
	  让这个分区的数据能够有机会都缓存在内存中。这样查询就可以只访问一个很小的分区表,能够使用索引,也能够有效的使用缓存。
	  
   5 分区的陷阱
     前面介绍的分区策略都基于两个非常重要的假设:查询都能够过滤掉很多额外的分区、分区本身不会带来很多额外的代价。
    事实是这两个假设在某些场景下会有问题。
	
	1)null值会使分区过滤无效
	  mysql分区时会创建第一个分区,用于存放分区列为null 或非法的记录。
	  例如 按照 partition by year(order_date) 来分区,那么order_date为null 或者是一个非法的值得时候,
	  记录都会被放入第一个分区。假设存在下面的查询 where order_date between 2012-09-08 and 2012-08-07
	  那么这个查询会检查2012这个分区,同时他还会检查第一个分区,检查第一个分区是因为year接受的参数
	  可能是null或者非法数值,如果是Null或者非法的话就会被放入第一个分区。
	  
	  同时,如果第一个分区非常大,特别是使用 全量扫描数据,不使用索引的策略时,代价会非常大。
	  
	  为了避免这种情况,我们可以创建一个无用的第一个分区,例如上面的例子可以使用
	  partition p_nulls values less than (0) 来创建第一个分区,如果插入的数据都是有效的,那么
	  第一个分区就是空的,即使需要检测第一个分区,代价也会非常小。
	  
	  在mysql 5.5就不需要这个技巧了,因为可以直接使用列本身而不是基于列的函数进行分区。
	  partition by range columns(order_date).
	  
	 2) 分区列和索引列不匹配
	    如果定义的索引咧和分区列不匹配,会导致查询无法进行分区过滤。假如在b列上建立索引	,在a列上进行分区。
		因为每个分区都有其独立的索引,所以扫描列a上的索引就需要扫描每一个分区内对应的索引。要避免这种情况,就要避免建立和分区不匹配的索引,除非查询中还同时包含了可以过滤分区的条件。
	  
	 3) 选择分区的成本可能很高
	    对于使用范围来分区的情况来说,查询的成本可能会非常高。这一行属于哪个分区,这些符合查询条件的行分布在那些区
		找到这样的回答的代价可能会非常高。随着分区数的增长,成本会越来越高。
		在按行写入大量数据的时候,每写入一行数据到范围分区的表时,都需要扫描分区定义列表来找到合适的分区。
		
		可以通过限制分区的数量来缓解这类问题,对于大多数系统来说100个分区是没有问题的。
		其他的分区类型,比如键分区和哈希分区,则没有这样的问题。
		
	 4) 打开并锁住所有底层表的成本可能很高
	    当查询访问分区表的时候,mysql需要打开并锁住所有的底层表,这是分区表的另一个开销。这个操作在分区过滤之前发生,所以无法通过分区过滤
		降低此开销,并且该开销也和分区类型无关,会影响所有的查询。这一点对于一些本身操作非常快的查询,比如根据主键查找
		单行,会带来明显的额外开销。
		
		我们可以通过使用批量操作的方式来降低这个操作带来的开销。同时还需要限制分区的个数。
		
	 5) 维护分区的成本可能很高	  
	  
	  
	  
	  
	  
	  
	  
	  

   请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

 

 

 

 

 

分享到:
评论

相关推荐

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    第七部 MySQL主从复制企业级深入高级应用实战(20节) 01-MySQL主从复制原理画图口头考试讲解.avi 02-课前思想-企业面试必胜绝招讲解.avi 03-MySQL主从复制故障多个案例实战讲解.avi 04-回顾MySQL主从复制配置步骤及...

    高性能MySQL(第3版).part2

    第7章MySQL高级特性259 7.1分区表259 7.1.1分区表的原理260 7.1.2分区表的类型261 7.1.3如何使用分区表262 7.1.4什么情况下会出问题263 7.1.5查询优化266 7.1.6合并表267 7.2视图270 7.2.1可更新视图272 ...

    70道MySQL面试题大全

    MySQL作为一款免费开源的关系型数据库管理系统,在业界使用广泛,涵盖了众多的数据管理功能和特性,从基础的数据类型,到高端的事务处理、...了解MySQL的基础知识和高级特性,对于开发者和数据库管理员都是必不可少的。

    Navicat Premium操作手册.7z

    入门9系统需求10注册10安装10维护或升级11最终用户许可协议12连接21常规设置22高级设置24SSL 设置28SSH 设置29HTTP 设置30服务器对象31MySQL 对象31MySQL 表31MySQL 表栏位31MySQL 表索引33MySQL 表外键34MySQL 表...

    Oracle入门教程.三思笔记.一步一步学Oracle

    [三思笔记]RMAN高级应用之Duplicate复制数据库.pdf [三思笔记]RMAN管理ORACLE_RAC数据库的备份与恢复.pdf [三思笔记]statspack初步学和用.pdf [三思笔记]动态性能视图.pdf [三思笔记]全面学习MySQL+Proxy特性.pdf ...

    flink1.12入门到精通视频课程

    共课程包含9个章节:Flink安装部署与快速入门、Flink批处理API、Flink流处理API、Flink高级API、Flink-Table与SQL、Flink-Action综合练习、Flink-高级特性和新特性、Flink多语言开发、Flink性能调优 课程目录: ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 python s3 day46 mysql的数据类型 05 数据表操作 06 表记录之增删改操作 07 表记录查询之查询 第47章 01 多表查询之连接查询 02 级联删除与set null 03 多表查询之连接查询 04 多表查询之复合查询与子查询 05 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例252 获取磁盘分区的大小 327 实例253 遍历指定目录下的所有文件 329 实例254 遍历、删除指定目录下的所有文件 330 第5章 会话应用 333 5.1 COOKIE 334 实例255 控制登录用户的过期时间 334 实例256 自动登录 335...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例252 获取磁盘分区的大小 327 实例253 遍历指定目录下的所有文件 329 实例254 遍历、删除指定目录下的所有文件 330 第5章 会话应用 333 5.1 COOKIE 334 实例255 控制登录用户的过期时间 334 实例256 自动登录 335...

    discuz!6.1GBK 版本论坛系统

    从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    javapms门户网站源码

    Java语言之所以受人推崇,是因为它确实称得上是一种新一代编程语言,具有面向对象、可移植性好、与硬件无关、系统强健安全、提供了并发机制、性能高的众多优点,并提供了分布性、多线程、动态性的支持。 Java作为一...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

Global site tag (gtag.js) - Google Analytics