面试题-Mysql数据库优化之水平分表

2020-09-07 01:12:30 浏览数 (1)

之前我们说过垂直分表,今天来说下水平分表,有的时候就算通过垂直分表还会存在慢sql的问题,因为经过垂直拆分后单表的数据量并没有减少,那如何解决这个问题,水平分表是目前解决单表数据量过大的常用方式。

水平分表:将一张表水平拆分成多张表结构一样的表,就像我们有张订单表1000万数据量,拆分后订单_1表、订单_2表....订单_9表,拆分成10张表后,单表的数据量减少到100W,解决了问题。

举个例子:原表order拆分为相同表结构表名不同的四张表

分片键:用于分片的字段,一般表中主键,比如订单表可以根据订单号或者客户号作为分片键。

分片方式:分片几种方式,我们常用的就是红框中的两种

第一种,比如按照表中的创建时间分片DATE_FORMAT(create_time,'%Y')='2020'的数据在table_2020,DATE_FORMAT(create_time,'%Y')='2021'的数据在table_2021等等。

第二种,按照一定的算法表达式,比如order_id%5算法分成5张表,笔者公司就是通过这种方式。

水平分表后,就会出现很多问题分表后的非分表字段查询、分表后的排序、分表后的分页查询等。

非分表字段查询:通过建立映射关系表方式解决,建一张分表键和非分表键的关系表,先通过非分表键找到分表键,然后确定表再进行查询。

分表后的排序、分表后分页:select * from table order by create_time desc limit 100,这条sql在没分表前直接就可以查询,分表后一般是这样解决分表查询每张分表order by limit 100的数据,然后通过程序聚合结果,最终得到limit 100的结果。

我们也可以通过中间件Sharding JDBC来实现分库分表,后续会专门介绍Shading JDBC的接入、实现、原理。

0 人点赞