一起从概念上来了解下分区、分表、分片、分库
前言
现在做应用开发,数据也是越来越多了,之前遇见一个linux io异常的问题,查询分析后发现是mysql出现了慢查询导致,后来看了下问题表的数据,1亿+,单库单表这么多数据不慢查询才怪,因为这个系统和我关系不大,只是帮别人看了下,最后分析了下业务,业务比较复杂,存在多表join,复杂查询等情况,无法做单库分表,最后退而求其次,给了建议做数据备份,表中保留了5W近期数据。然而这种处理是没有办法的办法。笔者后期文章会陆续详解更好的处理办法,比如分区,分表,分片,分库等待,欢迎关注。
分区
把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。MySQL5以后才支持分区,但是不支持二级分区,分区并不能明显解决性能问题,测重点是突破磁盘的读写能力,通过提高磁盘的读写能力,来增加mysql性能。分区不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表还是一张表,数据处理还是由自己来完成。
分表
应用层面的分表,人工把一张逻辑上完整的表分成若干个小表。比如user表分为user1…user128。对代码不透明。
代理层面的分表,通过MERGE引擎或者代理中间件把表分成若干的字表,对应用只保留一个“表壳”,对代码透明。
分表和分区比较类似,侧重点不同,分区侧重提高读写io性能,分表侧重提高并发性能。两者不冲突,可以配合使用。分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。分表后,单表的并发能力提高了,磁盘I/O性能也提高了。
分片
分片就是分库+分表,将表中数据按照某种规则放到多个库中,既分表又分库,就相当于原先一个库中的一个表,现在放到了好多个表里面,然后这好多个表又分散到了好多个库中。分片和分区也不冲突。
分库
分库,单纯的分库就是垂直切分,把不同业务逻辑的表分开存储在在不同的数据库。不同库join一般使用接口的方式替换,同时尽量做好冗余。