MySql分库分表与分区的区别和思考 您所在的位置:网站首页 mysql分区分表分库 MySql分库分表与分区的区别和思考

MySql分库分表与分区的区别和思考

#MySql分库分表与分区的区别和思考| 来源: 网络整理| 查看: 265

一.分分合合

  说过很多次,不要拘泥于某一个技术的一点,技术是相通的。重要的是编程思想,思想是最重要的。当数据量大的时候,需要具有分的思想去细化粒度。当数据量太碎片的时候,需要具有合的思想来粗化粒度。

1.1 分

  很多技术都运用了分的编程思想,这里来举几个例子,这些都是分的思想

集中式服务发展到分布式服务 从Collections.synchronizedMap(x)到1.7ConcurrentHashMap再到1.8ConcurrentHashMap,细化锁的粒度的同时依旧保证线程安全 从AtomicInteger到LongAdder,ConcurrentHashMap的size()方法。用分散思想,减少cas次数,增强多线程对一个数的累加 JVM的G1 GC算法,将堆分成很多Region来进行内存管理 Hbase的RegionServer中,将数据分成多个Region进行管理 平时开发是不是线程池都资源隔离 2.2 合

  很多技术也运用到了合的编程思想,这里举几个例子,这些都是合的思想

TLAB(Thread Local Allocation Buffers),线程本地分配缓存。避免多线程冲突,提高对象分配效率 逃逸分析,将变量的实例化内存直接在栈里分配,无需进入堆,线程结束栈空间被回收。减少临时对象在堆内分配数量 CMS GC算法下,虽然使用标记清除,但是也有配置支持整理内存碎片。如:-XX:UseCMS-CompactAtFullCollection(FullGC后是否整理,Stop The World会变长)和-XX:CMSFullGCs-BeforeCompaction(几次FullGC之后进行压缩整理) 锁粗化,当JIT发现一系列连续的操作都是对同一对象反复加锁和释放锁,会加大锁同步的范围 kafka的网络数据传输有一些数据配置,减少网络开销。如:batch.size和linger.ms等等 平时开发是不是都个叫批量获取接口 二.分区

  本文一切基于MySql InnoDB

  说了这么多,接下来说主体,先说分区,因为之前博主写过一篇MySql分区的博客所以这里不会多费笔墨来写,具体见:https://www.cnblogs.com/GrimMjx/p/10526821.html

2.1 实现方式

  具体如何实现上面链接里有写,这里只需记住如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。

  这个是数据库分的,应用透明,代码无需修改任何东西。

2.2 内部文件

  先去data目录,如果不知道目录位置的可以执行:

   接下来看下内部文件:

 

  从上图我们可以看出,有2中类型的文件,.frm文件和.ibd文件

.frm文件:表结构文件 .ibd文件:InnoDB中,索引和数据都在同个文件.ibdata(你的执行结果可能是.MYD索引文件和.MYI数据文件,没关系,这是MyIsAm存储引擎,对应着InnoDB的.ibd文件)。因为Order这张表分为5个区,所以有5个这样的文件 .par文件:你执行的结果可能有.par文件也可能没有。注意:从MySql 5.7.6开始,不再创建.par分区定义文件。分区定义存储在内部数据字典中。 2.3 数据处理

  分区表后,提高了MySql性能。如果一张表的话,那就只有一个.ibd文件,一颗大的B+树。如果分表后,将按分区规则,分成不同的区,也就是一个大的B+树,分成多个小的树。

  (PS:如果想研究一颗聚集索引B+树可以放多少行数据,请看:https://www.cnblogs.com/GrimMjx/p/10540263.html)

  读的效率肯定提升了,如果走分区键索引的话,先走对应分区的辅助索引B+树,再走对应分区的聚集索引B+树。

  如果没有走分区键,将会在所有分区都会执行一次。会造成多次逻辑IO!平时开发如果想查看sql语句的分区查询可以使用explain partitons select xxxxx语句。可以看到一句select语句走了几个分区。 

mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有