一、介绍
数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。在没有分库分表情况下当订单表数量超过1000万条以上,我们需要对订单表按照业务进行分库分表(当超过500万条数据数据库查询用索引效率大大下降)。
分库分表查询:当订单页面需要根据会员姓名、手机号码、订单号、下单开始时间、下单结束时间等等,设计到多个模块一起关联查询时,
采用如下方案:
1.对不可变字段做冗余,方便查询。比如用户姓名在金融平台用户实名后姓名不能更改。
2.根据阿里规则:各个模块不要做关联查询,避免join。比如:上述订单表查询,首先到会员数据库中查询,然后在到订单表中查询。
**规则:**既然分库分表就不要join查询。
- 一般会员id使用UUID,那么首先要进行hash获取到整数值,然后进行去模操作
- 所有数据根据数据库表数量进行取模
- 必须对数据库查询关键字段添加索引,提高查询效率
二、原理
分库分表主要是通过解析、改写、路由、执行、结果归并等流程。
三、实践
例如现在有一条查询语句:
select * from t_user where id = 4
进行了分库分表操作,2个库user0,user1,采用的分片键为id,逻辑表为t_user,真实表为t_user_0、t_user_1两张表,分库、分表算法为均为取余(%2)。
sql解析:通过解析sql语句提取分片键列与值进行分片,例如比较符 =、in 、between and,及查询的表等。
sql改写:根据解析结果,及采用的分片逻辑改写sql,上例经过sql改写后,真实语句为:
select * from t_user_0 where id = 4;
sql路由:找到sql需要去哪个库、哪个表执行语句,上例sql根据采用的策略可以得到将在ds0库,t_user_0表执行语句。
sql执行:执行改写后的sql。
结果归并:当我们执行某些复杂语句时,sql可能会在多个库、多个表中执行,sql分别对应执行后会对结果集进行归并操作,得到最终的结果。