作为数据库核心成员如何让淘宝不卡顿一点,淘宝app卡顿( 三 )


几年前 , 业务简单,应用的数据比较少,表结构也不复杂 。只有一个数据库,数据库中的表是一张完整的表 。而到了今天,2007年了,业务复杂起来了,数据量爆增,单表数据破千万甚至上亿条,一条DML语句,死慢死慢的 。这种情况下加索引已不再有显著的效果 。
这个时候,数据库效率瓶颈不是靠加索引 , sql优化能搞定的 。
正确出路:分表分库,通过将表拆分 , 来降低单表数据量,进而提高数据库操作效率 。
分表分为:
垂直分表水平分表分库分为:
垂直分库水平分库由于TDDL不参与业务,而垂直分库分表是强业务相关的 , 因此TDDL暂不参与垂直分库分表,只在水平分库分表方向上努力 。
4.2.1 垂直分表
垂直拆分是将一张表垂直拆成多个表 。往往是把常用的列独立成一张主表 。不常用的列以及特别长的列拆分成另一张拓展表 。

作为数据库核心成员如何让淘宝不卡顿一点,淘宝app卡顿

文章插图
简单垂直分表举例
核心要素:
冷热分离,把常用的列放在一个表,不常用的放在一个表 。大字段列独立存放 , 如描述信息 。关联关系的列紧密的放在一起 。它带来的提升是:
为了避免IO争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响 。充分发挥热门数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累 。4.2.2 水平分表
水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中 。
作为数据库核心成员如何让淘宝不卡顿一点,淘宝app卡顿

文章插图
简单水平分表举例
简单点的技巧:按照枚举类型区分 。
作用总结:
库内的水平分表,解决了单一表数据量过大的问题,分出来的小表中只包含一部分数据 , 从而使得单个表的数据量变小 , 提高检索性能 。避免IO争抢并减少锁表的几率 。4.2.3 垂直分库
垂直分库是指按照业务将表进行分类,分布到不同的数据库上面 , 每个库可以放在不同的服务器上,它的核心理念是专库专用 。
作为数据库核心成员如何让淘宝不卡顿一点,淘宝app卡顿

文章插图
垂直分库
作用总结:
解决业务层面的耦合,业务清晰 。高并发场景下 , 垂直分库一定程度的提升IO、数据库连接数、降低单机硬件资源的瓶颈 。能对不同业务的数据进行分级管理、维护、监控、扩展等 。垂直分库通过将表按业务分类,然后分布在不同数据库,并且可以将这些数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果,但是依然没有解决单表数据量过大的问题 。4.2.4 水平分库(TDDL 核心)
水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上 。
作为数据库核心成员如何让淘宝不卡顿一点,淘宝app卡顿

文章插图
水平分库
作用总结:
解决了单库单表数据量过大的问题,理论上解决了高并发的性能瓶颈 。水平分库核心要解决的问题:
如何知道数据在哪个库里?- 路由问题结果合并全局唯一主键ID分布式事务(暂时不支持)4.2.5 水平分库——问题解决
(1)自动路由算法
sql转发:在水平拆分后,数据被分散到多张表里 。原来的一个sql需要拆解 , 进行转发路由 。
例:
select * from tb1 where member_id in ('test1234', 'pavaretti17', 'abcd');=>select * from tb1 where member_id in ('test1234', 'pavaretti17', 'abcd');select * from tb1 where member_id in ('abcd');