欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
订单系统中的分库分表解决方案
使用分库分表的场景,除了之前我们说的用户表,还有订单表也需要进行分库分表,接下来我们对订单数据量分析一下
就比如在中小型的电商公司来说,假设注册用户量达到 1000w,那么根据二八原则,电商系统的 80% 访问量都是由 20% 的用户所生成,因此日活用户大概为 200w,但是像 20% 的日活比例就已经算非常高了,一般公司也达不到,因此就按 10% 来算,日活用户在 100w 左右
那么如果要生成订单的话,需要用户购买商品,这个比例就更低了,就按日活用户的 1% 来算,每天生成 1w 的订单量,那么一年生成 360w 的订单量,只需要 3 年订单表就会成为千万级别的大表
而在 MySQL 中,一般建议将单表数据量控制在百万级别,不要超过千万,如果 100w 以内不会出现性能问题,因此要对订单表进行分库分表设计
对订单表分库分表所带来的问题
订单表分库分表时,我们要考虑如何对分库分表之后的数据进行查询
比如:
- 用户对自己订单的分页查询
- 后台系统对所有订单数据进行复杂的分页查询
这里以这两个问题为例,说一下在分库分表中如何解决
首先对第一个问题来说,用户对自己订单的分页查询,还是和之前一样,按照(user_id, order_id)做一个映射表,将这个映射表也给分库分表
那么当用户需要分页查询自己的订单数据时,先根据 user_id 哈希映射定位到对应的映射表,获取自己所有订单的 order_id,再拿 order_id 去进行分页,分页之后,再根据 order_id 进行哈希映射,定位到对应的表中,获取完整的订单数据
那么这是用户对订单分页数据的简单查询,如果用户也对订单数据进行状态、订单商品名称查询该如何筛选呢?
在映射表中放更多的字段就可以了,就比如将映射表由(user_id, order_id)改为(user_id -> order_id, order_status, product_name)
那么如果用户需要根据订单状态分页查询的话,只需要根据 user_id 先取出自己的所有映射数据,再根据映射数据中的 order_status、product_name 进行筛选匹配,并且进行分页,最后将得到的 order_id 去分库分表中获取完整的数据
对于第二个问题,后台系统对所有订单数据进行复杂的分页查询,一般就是根据订单中的多条数据进行组合查询,比如根据订单的完成状态、完成时间、订单类型等多个条件进行复杂查询,可以将订单数据的搜索条件都同步到 ES 里,再使用 ES 来进行复杂搜索,找出来一批 order_id,再通过 order_id 去分库分表中找到对应的数据
所以,分库分表带来查询的问题的话,一般就是两种解决方案:
- 建立映射表,对映射表也分库分表
- 使用 ES 进行复杂查询