数据库的切分和优化

简介: 数据库的切分和优化 1.引言 随着互联网应用的普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿pv无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。

数据库的切分和优化

1.引言

随着互联网应用的普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿pv无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。

通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式:

(1)水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失;

(2)通过负载均衡策略:有效的降低了单台机器的访问负载,降低了宕机的可能性;

(3)通过集群方案:解决了数据库宕机带来的单点数据库不能访问的问题;

(4)通过读写分离策略:最大限度提高了应用张读取数据的速度和并发量

2.基本原理与概念

(1)什么是数据切分

如果在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢?答案就是:Sharding。

Sharding不是某个特定数据库附属的功能,而是在具体实现技术的抽象,是水平扩展的解决方案,主要目的是为了实现单点服务器的i/o能力限制,解决数据库扩展性问题。也就是: 通过一系列的切分规则将数据水平分布到不同的DB或table中,再通过相应的DB路由或者table路由规则找到需要查询的具体的DB或者table,进行query操作。

举一个例子:我们针对一个Blog应用中的日志来说明,比如日志文章article表有如下字段:

[sql] view plain copy

 
  1. article_id(int),tile(varchar(128)),contnet(varchar(1024)),user_id(int)

这样一张表我们怎样切分呢?怎样将这样的数据分不到不同的数据库中的表中呢?其实分析blog应用,我们可以得出如下结论:可以使用user_id字段作为我们分库的规则基础

将user_id为1-10000的所有文章放入DB1的article表中,将user_id为10001-20000的所有文章放入DB2的article表中,以此类推,一直到DBn。

这样一来,文章数据就被分到了各个数据库中,达到了数据切分的目的。接下来要解决的就是怎么找到具体的数据库呢?解决方法也很明显:既然分库的时候我们使用了分区字段user_id,那么数据库路由的时候当然少不了user_id。我们知道了user_id,利用分库时的规则,反过来定位具体数据库,比如user_id=234,利用刚才的规则,就会定位到DB1,降入user_id是12343,利用该规则,就会定位到DB2.以此类推,利用分库的规则,反向路由到具体的DB,这个过程我们称为DB路由。

(2)如何数据切分

1)分库

也就是物理上的数据切分。将数据通过一系列的切分规则将数据分布到不同的DB服务器上,通过路由规则访问特定的数据库。这样一来,每次访问的就不是单台服务器了,而是N台,这样就可以降低单台机器的负载压力。

分库方式:

1>按号段分

如用user_id来区分,1-1000的对应DB1,1001-2000的对应DB2,以此类推。

优点:可部分迁移

缺点:数据分布不均

2>hash取模分

对user_id进行hsah(如果user_id是数字的话,直接用user_id也行),然后用一个特定的数字,比如需要将一个数据库切分成4个数据库的话,我们就用4对user_id进行取模,也就是user_id%4,这样的话就有4种结果:1的时候对应DB1,2的时候对应DB2,3的时候对应DB3,0的时候对应DB4,这样一来数据就会非常均匀的将数据分配到4个DB中。

优点:数据分布均匀

缺点:不能按照近期性能分摊数据

2)分表

也就是数据库内的数据切分。对数据通过一系列的切分规则,将数据分不到一个数据库的不同表中,如将article表分为article_001,article_002等子表,若干个表水平拼接会在逻辑上组成一个完整的article表。

这么做作用是十分明显的。举个例子:比如article表中有5000w条数据,此时我们在表中insert一条新的数据,insert完成之后,数据库会针对这张表重新建立索引,而5000w条数据建立索引的系统开销是不容忽视的。但是如果我们把表分为100个子表呢?从article_001一直到article_100,5000w数据平均下来,每个子表中就只有50w条数据,这时候我们向一张只有50w条数据的表中insert之后建立索引的时间就会成数量级的下降,极大的提高了DB运行时的效率,提高了DB的并发量。

综上:分库降低了单点机器的负载;分表提高了了数据操作的效率,尤其是写操作的效率

原文地址http://www.bieryun.com/3281.html

相关文章
|
2月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
6月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
284 1
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
214 6
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
625 5
|
5月前
|
机器学习/深度学习 SQL 运维
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
176 4
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
10月前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
11月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
298 11
|
11月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
1892 1

热门文章

最新文章