赞
踩
数据库中的数据量不一定是可控的
,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈
。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题
,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
例子
初始的数据库设计
要想提高性能,有两种方案
1. 硬件上的提高(提高cpu,提高内存,提高硬盘…但是指标不治本)
2. 分库分表(看下图)
数据库的切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。
数据的切分根据其切分规则的类型,可以分为 垂直切分 和水平切分。
垂直切分: 把单一的表拆分成多个表,并分散到不同的数据库(主机)上。
水平切分:根据表中数据的逻辑关系,将表中的数据按照某种条件拆分到多台数据库上
一个数据库有多个表构成,每个表对应不同的业务,垂直切分是只按照业务将表进行分类,将其分布到不同的数据库上,这样就将数据分担到了不同的库上(专库专用)
有如下几张表:
• 用户信息表(User)
• 订单信息表(Orders)
针对以上案例,垂直切分就是根据每个表的不同业务进行切分。
比如 User 表, Orders 表,将每个表切分到不同的数据库上。
拆分后业务清晰。
系统之间进行整合或扩展很容易。
按照成本、应用的等级、应用的类型等奖表放到不同的机器上,便于管理,数据维护简单
部分业务表无法关联(Join), 只能通过接口方式解决,提高了系统的复杂度。
受每种业务的不同限制,存在单库性能瓶颈,不易进行数据扩展和提升性能。
事务处理变得复杂。
与垂直切分对比,水平切分不是将表进行分类,而是将其按照某个字段的某种规则分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。
简单来说,我们可以将对数据的水平切分理解为按照数据行进行切分,就是将表中的某些行切分到一个数据库表中,而将其他行切分到其他数据库表中。
这种切分方式根据单表的数据量的规模来切分,保证单表的容量不会太大,从而保证了单表的查询等处理能力
例如将用户的信息表拆分成 User1、User2 等,表结构是完全一样的。我们通常根据某些特定的规则来划分表,比如根据用户的 ID 来取模划分。
在博客类系统中,读取量一般都会很大。当同时有 100 万个用户在浏览时,如果是单表,则单表会进行 100 万次请求,如果是单库,数据库就会承受 100 万次的请求压力。如果采取水平切分来减少每个单表的压力,将其分为 100 个表,并且分布在 10 个数据库中,每个表进行 1 万次请求,则每个数据库会承受 10 万次的请求压力,虽然这不可能绝对平均,但是这样,压力就减少了很多,并且是成倍减少的。
单库单表的数据保持在一定的量级,有助于性能的提高。
切分的表的结构相同,应用层改造较少,只需要增加路由规则即可。
提高了系统的稳定性和负载能力
切分后,数据是分散的,很难利用数据库的 Join 操作,跨库 Join 性能较差。
分片事务的一致性难以解决,数据扩容的难度和维护量极大。
数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分
数据库拆分原则:就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
优先考虑缓存降低对数据库的读操作。
再考虑读写分离,降低数据库写操作。
最后开始数据拆分,切分模式: 首先垂直(纵向)拆分、再次水平拆分。
首先考虑按照业务垂直拆分。
再考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中)
最后再考虑分表,单表拆分到数据1000万以内。
综上所述,垂直切分和水平切分的共同点如下:
• 存在跨节点 Join 的问题。
• 存在跨节点合并排序、分页的问题。
• 存在多数据源管理的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。