`

数据库单表拆分问题

 
阅读更多

本期焦点问题:单一数据库内分表

本期多个项目出现了在单一数据库内分表的情况,典型的做法是:

某个表(表A)预期会有几千万乃至上亿条数据,于是在单库内拆分成若干张独立的表: A_1, A_2, A_3, … , A_n用“表名+后缀”来区分。

 

在绝大多数情况下,这并不是合适的做法,下表给出了库内分表对一些关键指标的影响:

项目

库内分表

应用开发难度

比单表高

需要管理数据的路由,跨表查询,排序等都较复杂。

未来拆库难度

比单表高

需要对多个表进行数据迁移,同时应用

表结构变更的难度

比单表高

除了耗时,还要变更多个表。

查询性能

走索引,和单表无明显差别。

全表扫描,如果并发执行,会比单表快一些。

写入性能

和单表比无明显差别

并发性能

对行锁无影响,会减少表锁冲突,但是按主键更新不加表锁。

 

从上表可以看出,库内分表提供的好处非常微小,而且在我们的业务场景下也基本用不到这些好处。但是却带来程序设计、运维等多方面的困难,

基于这些因素,我们不赞成使用库内分表这种设计方式。

 

那当库表出现以下几种情况时,如何来应对?

1.       记录数高

一般我们不建议单表出现1千万行以上的数据。如果业务上出现了这样的数据,首先要考虑的是通过归档来降低数据量。

归档可以有效把冷热温数据分开,同时,温数据还可以设计成在低级别SLA下提供服务。

 

对于不能归档的数据,主要是主数据,如用户,商品。可根据tps/qps及它们之间的比例、应用对数据一致性的要求、磁盘空间的大小来决定是做读写分离或水平拆分。

但主数据一般都是高访问量的共享数据,正常应该通过拆库来保证性能。

 

2.       慢查询

慢查询的出现不能想当然归于表的记录数太多,表的记录数和慢查询之间并没有必然的关系。慢查询出现的常见原因:

l  没有正确使用索引或索引失效,导致全表扫描了

l  表设计不合理,出现了多表Join

l  SQL本身的写法有问题,出现了大量的中间结果

l  SQL返回结果集过大

 

所以慢查询应该重点从表的设计和SQL的写法上去解决,库内分表不是一个好的方案。

 

3.       TPS/QPS

TPS高是拆库的最重要的依据,比如说一些订单表,优惠券表等大表都有数亿条数据,拆分的首要原因就是TPS撑不住了,超过6K从库就会开始有明显延迟。

如果TPS不高但QPS很高,而且对数据的一致性要求不高,可以考虑读写分离方案。

 

 

 

分享到:
评论

相关推荐

    关于数据库表拆分.docx

    为了解决这个问题,又拍网采用了数据库拆分策略。数据库拆分分为垂直拆分和水平拆分。垂直拆分是根据功能模块将表分布到不同数据库,例如将群组相关表与照片相关表分开,这种方式简单但可能无法完全解决问题。相比之...

    微服务:如何拆分共享数据库?

    在分解单体应用程序到微服务体系架构时,重点考虑独立数据库拆分是很重要的。您需要想出一个可靠的策略,将您的数据库分割为多个与应用程序对齐的小型数据库。简而言之,您需要将您的应用程序/服务从使用单一的共享...

    设计数据库(表结构设计)

    这一阶段是将信息拆分为独立的主题,每个主题对应一个表,避免冗余和不必要的复杂性。同时要注意,同一信息只存储一次,以减少错误的可能性,并提高数据一致性。 确定所需字段是设计中的重要一步。每个字段都应直接...

    数据库表拆分的三种解决方案.docx

    数据库表拆分是指将大型数据库拆分成多个小型数据库,以便提高数据库的性能和可扩展性。根据分库分表方案中实施切片逻辑的层次不同,我们可以将数据库分库分表的实现方案分为三大类:客户端分片、代理分片和支持事务...

    SQL数据库分割拆分工具

    SQL数据库分割拆分工具,体积小,非常好用,可以把大SQL文件自动分割成不同大小文件,方便导入数据库,文件大小可以自己设定,一般虚拟主机数据库导入限制2-8MB, 几百MB数据库没法一次导入,可以用这个分割成NN个,...

    Access中利用拆分后端数据库保存不同数据

    数据库拆分是指将一个大型数据库拆分成多个小型数据库,每个小型数据库保存特定的数据集。这样可以减少数据库的大小,提高数据的存储和检索效率。在 Access 中,我们可以通过将数据库拆分成多个文件,每个文件保存...

    Sql Server数据库中自定义拆分字符串函数Split()

    Sql Server数据库中自定义拆分字符串函数Split()

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    总结来说,基于MyBatis的数据库拆分和读写分离实现,涉及到对MyBatis框架的深入理解和扩展,包括对SqlSessionTemplate的改造、数据库拆分策略的设计(如垂直拆分和水平拆分的一致性哈希)、以及读写分离的路由机制。...

    拆分数据库中某列某行的数据,大量处理

    4. **更新数据库**:最后,通过数据访问层,将拆分后的新数据插入或更新到对应的数据库表列中。这可能涉及多条SQL语句,比如`UPDATE 表名 SET 姓名 = 新姓名, 年龄 = 新年龄, 性别 = 新性别 WHERE 条件`。 5. **...

    一分钟掌握数据库垂直拆分

    其中,数据库拆分是常用的一种手段,它能够有效减轻单一数据库的压力。本文将详细介绍“一分钟掌握数据库垂直拆分”的相关内容,帮助读者快速了解垂直拆分的基本概念、应用场景及其实现原理。 #### 二、水平拆分与...

    4_表拆分(1).zip

    - 对于分布式数据库和云环境下的表拆分策略,可能会涉及到分布式事务、数据一致性等问题。 - 实际案例分析,展示表拆分前后的性能对比,以及如何评估和选择合适的拆分策略。 表拆分是一项复杂的技术,需要综合考虑...

    SQLDumpSplitter 大Sql文件拆分成小文件

    SQLDumpSplitter是一款实用工具,专门用于解决在MySQL数据库环境中遇到的大SQL脚本文件拆分问题。当一个SQL脚本文件过大,导致导入数据库时出现性能瓶颈或超出系统限制时,这款工具就能派上用场。它能将一个大的SQL ...

    excel总表拆分订单明细

    excel 汇总数据库根据条件拆分成分表

    MYSQL数据库数据拆分之分库分表总结

    首先,单库单表是最基础的数据库设计模式,但随着用户数量的增长和数据量的累积,这种模式的性能会逐渐下降。例如,当`user`表中的数据过多时,查询速度会变慢,且在MySQL中添加列会导致全表锁定,影响服务。因此,...

    数据库垂直拆分与水平拆分概念

     垂直拆分是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站...

    数据库+分表分库+垂直拆分与水平拆分

    分表分库是指将一个大的数据表或数据库拆分成多个较小的数据表或数据库的过程。这种做法能够有效提升数据库的扩展性,并通过降低单个表的大小来提高查询效率。分表分库通常有两种方式:垂直拆分和水平拆分。 #### ...

    架构师修炼笔记 MySQL架构设计之数据库拆分技术方法 共45页.pptx

    在数据库架构设计中,数据库拆分是一种常见的解决高并发、大数据量问题的策略。本篇笔记主要探讨了MySQL数据库的拆分技术,包括CAP原则、可扩展性原则以及垂直拆分和水平拆分的实践。 首先,CAP原则是分布式系统...

    DB2和orcale数据库表分区方法和数据库的备份与恢复

    DB2数据库表分区是指将大型表拆分为多个小的、独立的部分,每个部分称为一个分区。分区的目的是为了提高表的可管理性、可扩展性和查询性能。DB2数据库提供了 RANGE Partitioning、LIST Partitioning、HASH ...

    如何使用Oracle数据库分区表.pdf

    Oracle 数据库分区表的主要特点是将大型表拆分为多个小表,每个小表都有其自己的段标识。这样可以提高用户在海量数据环境下的用户体验,减少DBA维护的时间和精力成本,从而有效降低海量数据处理的复杂度。 Oracle...

    历史表拆分压缩

    历史表拆分压缩的主要目标是优化数据库性能,降低存储成本,同时确保数据的完整性和可访问性。在数据库中,历史数据通常占用了大量的存储空间,但其查询频率相对较低。因此,将这些数据进行拆分和压缩,可以有效地...

Global site tag (gtag.js) - Google Analytics