数据库的切分和优化

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

数据库的切分和优化http://www.bieryun.com/3281.html

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的并发量。

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

相关文章
|
3天前
|
数据库
编程日记02:个人站优化数据库和日志
编程日记02:个人站优化数据库和日志
9 0
|
4天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
5天前
|
存储 关系型数据库 分布式数据库
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
PolarDB分布式版存储引擎采用CSM方案均衡资源开销与可用性。
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
|
13天前
|
存储 SQL 缓存
构建高效的矢量数据库查询:查询语言与优化策略
【4月更文挑战第30天】本文探讨了构建高效矢量数据库查询的关键点,包括设计简洁、表达性强的查询语言,支持空间操作、函数及索引。查询优化策略涉及查询重写、索引优化、并行处理和缓存机制,以提升查询效率和准确性。这些方法对处理高维空间数据的应用至关重要,随着技术进步,矢量数据库查询系统将在更多领域得到应用。
|
13天前
|
存储 缓存 固态存储
优化矢量数据库性能:技巧与最佳实践
【4月更文挑战第30天】本文探讨了优化矢量数据库性能的技巧和最佳实践,包括硬件(如使用SSD、增加内存和利用多核处理器)、软件(索引优化、查询优化、数据分区和压缩)和架构(读写分离、分布式架构及缓存策略)方面的优化措施。通过这些方法,可以提升系统运行效率,应对大数据量和复杂查询的挑战。
|
15天前
|
关系型数据库 大数据 数据库
关系型数据库索引优化
关系型数据库索引优化是一个综合的过程,需要综合考虑数据的特点、查询的需求以及系统的性能要求。通过合理的索引策略和技术,可以显著提高数据库的查询性能和整体效率。
22 4
|
15天前
|
存储 缓存 关系型数据库
关系型数据库数据库表设计的优化
您可以优化关系型数据库的表设计,提高数据库的性能、可维护性和可扩展性。但请注意,每个数据库和应用程序都有其独特的需求和挑战,因此在实际应用中需要根据具体情况进行调整和优化。
14 4
|
15天前
|
缓存 监控 关系型数据库
关系型数据库优化查询语句
记住每个数据库和查询都是独特的,所以最好的优化策略通常是通过测试和分析来确定的。在进行任何大的更改之前,始终备份你的数据并在测试环境中验证更改的效果。
22 5
|
15天前
|
数据库 开发者 UED
优化数据库性能的六大策略
在当今数字化时代,数据库性能对于系统的稳定运行至关重要。本文将介绍六大策略,帮助开发者优化数据库性能,提升系统效率和用户体验。
|
17天前
|
存储 SQL 关系型数据库
关系型数据库存储优化
关系型数据库存储优化
23 1