共计 1508 个字符,预计需要花费 4 分钟才能阅读完成。
本篇文章为大家展示了 SQL 中怎么实现分库分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
SQL 怎样进行分库分表
方案 1:
通过提升服务器硬件能力来提高数据处理能力,比如增加存储容量、CPU 等,这种方案成本很高,并且如果瓶颈在
MySQL 本身那么提高硬件也是有很的。
方案 2:
把数据分散在不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的,如下图: 将电商数据库拆分为若干独立的数据库,并且对于大表也拆分为若干小表,通过这种数据库拆分的方法来解决数据库的性能问题。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
分库分表的方式
分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。
垂直分表
下边通过一个商品查询的案例来垂直分表:
通常在商品列表中是不是显示商品详情信息的。
用户在浏览商品列表时,只有对某商品感兴趣时才会查看商品的详细描述。因此,商品信息中商品描述字段访问频次较低,且该字段存储占用空间较大,访问单个数据 IO 时间较长;商品信息中商品名称、商品图片、商品价格等其他字段数据访问频次较高。
由于这两种数据的特性不一样,因此他考虑将商品信息表拆分如下:
将访问频次低的商品描述信息单独存放在一张表中,访问频次较高的商品基本信息单独放在一张表中。
商品列表可采用以下 sql:
SELECTp.*,r.[地理区域名称],s.[店铺名称],s.[信誉]FROM[商品信息]p
LEFTJOIN[地理区域]rONp.[产地]=r.[地理区域编码]LEFTJOIN[店铺信息]sONp.id=s.[所属店铺]WHERE…ORDERBY…LIMIT…
需要获取商品描述时,再通过以下 sql 获取:
SELECT*
FROM[商品描述]WHERE[商品 ID]=?
小明进行的这一步优化,就叫垂直分表。
垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段。
它带来的提升是:
1. 为了避免 IO 争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响。
2. 充分发挥热门数据的操作效率,商品信息的操作的高效率不会被商品描述的低效率所拖累。
注意:
为什么大字段 IO 效率低:
第一是由于数据量本身大,需要更长的读取时间;
第二是跨页,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此 IO 效率较低。
第三,数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少来磁盘 IO,从而提升来数据库性能。
一般来说,某业务实体中的各个数据项的访问频次是不一样的,部分数据项可能是占用存储空间比较大的 BLOB 或是 TEXT。例如上例中的商品描述。所以,当表数据量很大时,可以将表按字段切开,将热门字段、冷门字段分开放置在不同库中,这些库可以放在不同的存储设置上,避免 IO 争抢。垂直切分带来的性能提升主要集中在热门数据的操作效率上,而且磁盘争用情况减少。
通常我们按以下原则进行垂直拆分:
1、把不常用的字段单独放在一张表;
2、把 text,blob 等大字段拆分出来放在附表中;
3、经常组合查询的列放在一张表中;
上述内容就是 SQL 中怎么实现分库分表,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。