前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题-Mysql数据库优化之水平分表

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

作者头像
别明天就今天吧
发布2020-09-07 01:12:30
6680
发布2020-09-07 01:12:30
举报

之前我们说过垂直分表,今天来说下水平分表,有的时候就算通过垂直分表还会存在慢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的接入、实现、原理。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 别明天就今天吧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档