分库分表

一、介绍

​ 数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。在没有分库分表情况下当订单表数量超过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分别对应执行后会对结果集进行归并操作,得到最终的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值