Mysql千万级大表优化——分区、分库、分表

https://www.zhihu.com/question/19719997/answer/549041957

1.分区:其实就是形成分区表(每个分区相当于独立有数据 + 索引)

https://www.cnblogs.com/GrimMjx/p/10526821.html

https://blog.csdn.net/qq_39390545/article/details/107144859

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实际上是通过对一组底层表的对象封装,但对SQL层来说是一个完全封装底层的黑盒子。

MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引。

分区的意思是指将同一表中不同行的记录分配到不同的物理文件中,几个分区就有几个.idb文件,不是我们刚刚说的区。MySQL数据库的分区是局部分区索引,一个分区中既存了数据,又放了索引。也就是说,每个区的聚集索引和非聚集索引都放在各自区的(不同的物理文件)

分区的好处是:

  • 可以让单表存储更多的数据
  • 分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作
  • 部分查询能够从查询条件确定只落在少数分区上,速度会很快
  • 分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备

分区的类型:

  • RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区
  • LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值

注:分区和分表的区别 

https://www.cnblogs.com/langtianya/p/4997768.html

  • mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表
  • 分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了(每个区块可以存在不同的磁盘上,以此提高mysql的磁盘IO性能)

a)分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同 的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

b)mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

 

2.分表

分表就是把一张大表,按照如上过程都优化了,还是查询卡死,那就把这个表分成多张表,把一次查询分成多次查询,然后把结果组合返回给用户。

分表分为垂直拆分和水平拆分,通常以某个字段做拆分项。比如以id字段拆分为100张表: 表名为 tableName_id%100

但:分表需要修改源程序代码,会给开发带来大量工作,极大的增加了开发成本,故:只适合在开发初期就考虑到了大量数据存在,做好了分表处理,不适合应用上线了再做修改,成本太高!!!

分表需要有一个全局唯一的索引,我理解蚂蚁金服的百表会分别进行查询,而不是路由到具体的表进行查询???【其实应该可以路由到具体的表进行查询?】
 
 
3.分库

把一个数据库分成多个,需要有路由机制,确定某个请求会转发到哪个id的库上(蚂蚁金服现在是百库百表)

 


4.分布式数据库中间件

  • 一个应用对应——数据源分片集群——(group id)数据源分片——弹性数据源(弹性位 + 物理数据源)
  • 弹性位:可以动态扩展物理数据源、利用弹性路由规则  实现流量的切换
  • 全局唯一的自增id
    • 有一个表,里面存了各业务的主键值
    • 使用”时间 + 自增主键值“生成全局唯一的id
    • 并且主键值的自增是每次取1000个,缓存在应用本地,避免主键表成为一个热点
posted @ 2020-09-05 20:23  king断雨  阅读(2937)  评论(0编辑  收藏  举报