当构建大型网站时,因为种种原因会对数据进行切分(对种种原因我们下次再解释)。根据切分的规则,切分一般包括两个方面:垂直切分和水平切分。而根据切分的层次可以分为:机器级切分即mysqld进程级切分,库级切分,表级切分。首先来说说什么是垂直切分:
垂直切分是按照不同的表(或者 Schema)来切分到不同的数据库(主机)之上,大部分情况下它都是机器级的切分。当业务间的耦合度很低,或者说数据属于不同的逻辑上的模块,一般采取这种切分。这里需要注意的是,在机器级的层次上去采取数据切分时必须保证不会存在切分块之间的事务。因为mysql的分布式事务的支持还不够。采用垂直切分的优点是显而易见的:数据库的拆分简单明了,拆分规则明确;应用程序模块清晰明确,整合容易;数据维护方便易行,容易定位。但是这不能解决访问极其频繁且数据量超大的表的性能问题,而且如前面所说在事务的处理,和处理不同切分块之间的表关联时有很多不方便。因此在垂直切分数据时往往它的粒度比较粗,一般时按业务的需求或者说和应用模块的切分相对应。
再来说说水平切分,这个在web应用中比较重要也比较难处理。
水平切分简单点说就是把原本是一个表中的数据拆分到多个表中或者多个数据库的多个表中,把一个表中的行拆分到多个表中,显然表的Schema是一样的。数据的水平切分一般都是在库级和表级进行切分。
水平切分的优点显而易见主要有解决了大表的性能的问题。同时事务的处理相对比较简单。可扩展性强。但是水平切分也会产生一些问题,下面详细说说。
1.不能使用外键约束与join。很明显外键是分布到多个表中的无法在数据端去保证外键约束。同理也无法做到完全意义上的join。互联网中的应用对数据一致性的要求没有企业级IT应用要求那么高(当然像百付宝这种应用除外)。所以大部分的时候我们可以在应用层去适当的维护数据在外键上的约束。至于怎么是适当就取决于应用对性能与一致性的权衡。Join其实在大规模应用中是应该尽量避免的。尤其是关键的查询。如果你发现应用中30%以上的query都要用到join那就应该好好考虑数据库schema的设计。对于需要join的时候,可以通过冗余来实现。一个表包含需要join的query中的所有select字段。而且对于使用join的query一般会有特定的过滤条件。同理这个表也可以根据过滤条件水平切分。举个例子来说。表User,用户表与表Post,帖子表。为了查询某个用户的所有帖子,一般采取join的方式。在分库分表的情况下,无法确定join的Post表是哪一个。所以可以建一个冗余表Post_for_user。其中包含所业务查询所需要的所有信息。同时可以按照与User表相同的分库分表方式去分表。当然冗余也有缺点。一个是表变多了,再就是每次往Post表中插入数据时必须在Post_for_user表中插入同样的数据。这样逻辑就复杂且插入性能受影响。当然可以采用异步的更新Post_for_user表的方式去解决,下次再讨论这个问题。
2.对于不是按分库分表的字段做where条件去query或者update时需要在所有表上执行这个sql语句。对于特定的query如果不能根据where条件确定在哪个表上执行sql,就必须在所有的表上执行sql.这个显然是不可取的.因此必须根据业务需求去增加冗余的map表.比如:在user表中需要根据login_name去查询用户信息,但是user表是按照user_id分库分表的.所以可以构造一个user_map表去形成login_name与user_id的对应关系.并且这个表的分库分表原则是根据login_name去hash的.这样可以解决这个问题.但是可能有人要问如果有很多这种查询怎么办?其实从互联网应用来说,远没有那么复查的查询.所有的业务都是以user为中心的.好好的设计表是王道.当然这种方法还是有同1一样的冗余问题.
3.保持主键的唯一性比较复杂.当切分以后,主键的唯一性就不能靠数据库表本身去保证了。有两种方法去解决这个问题。1.在应用层去保证。可以实现一个服务,它的功能就是生成顺序增长的id。这样的话每次数据库的插入动作都需要先访问这个服务。这个服务很显然是个单点。至于怎么实现这个服务有很多种选择,比如用一个文件记当前的id,或者用一个特殊表的自增的字段做全局的id。2.在数据库端去保证。一般的方法是通过指定自增字段的起始点和步长去避免id的的重复,以达到保持主键唯一性的目的。比如分1000个表,可以指定步长为1000,起点分别是1~1000.或者按id区段分。步长为1,但是不同区段的起点相差很大。
总之,数据水平切分,涉及到的问题还是很多的。关键是根据业务本身的需求,采取一种合适的切分策略。不要为了切分去切分。
引用:http://www.zhouxblog.com/archives/37
分享到:
相关推荐
数据切分(Sharding)是一种用于水平扩展数据库的技术手段,旨在通过将数据分散到多个物理节点上来减轻单个数据库的负载压力,并提高整体系统的可靠性和可用性。具体来说,数据切分涉及以下几个关键步骤: 1. **...
数据切分的基本思想是根据一定的业务规则或键值范围将数据分配到不同的分片上。例如,在博客应用中,日志文章(article)表可能包含user_id字段,我们可以根据user_id将数据分片。比如,user_id在1-10000的文章存储...
水平切分(又称为Sharding)是一种数据库分片技术,通过将数据分散到多个物理数据库或数据库实例上来实现负载均衡和提升性能的目的。本文主要探讨的是基于“单KEY”业务场景下,如何有效地实施数据库水平切分以及在...
MySQL数据库在当前互联网环境中扮演着至关重要的角色,尤其在处理高并发、高流量和大数据量的场景下,其优化显得尤为重要。本文主要讨论了MySQL数据库的优化策略,包括存储引擎的选择、索引机制的优缺点、存储过程的...
MySQL数据库是世界上最受欢迎的开源关系型数据库之一,广泛应用于各种规模的企业和项目中。为了确保系统性能和响应速度,对MySQL进行性能优化至关重要。本文将详细介绍优化MySQL数据库性能的八大妙手,帮助你提升...
本Demo将展示如何使用Solr 7.4与MySQL数据库集成,实现数据导入,并结合IK分词器提升中文搜索体验。 首先,你需要下载并安装Solr 7.4.0。解压压缩包`solr-7.4.0`,这是一个包含Solr服务器和配置文件的完整包。在`...
MySQL数据库扩展小记 mysql架构方案 MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with ...
5. 高效的设计模型:这部分对数据库设计原则、正则化与非正则化的选择、表容量设计和数据切分、索引设计等进行阐述。设计模型的高效性对于数据库的性能至关重要,需要在保证数据完整性和一致性的同时,尽可能地提高...
1. **Mycat架构理解**:Mycat的核心功能包括路由分片、数据切分、读写分离等,它的设计目标是提供一个透明的数据库中间层,使得应用程序无需改动即可访问分布式数据库。理解Mycat的工作原理,包括数据节点、切分规则...
### 数据切分方法详解 #### 一、引言 在当今大数据时代,随着业务规模的不断扩大,单一数据库服务器已难以满足高性能、高可用性的需求。因此,如何有效地管理和利用数据库资源成为了IT领域的一个重要课题。数据...
MySQL数据库在处理大规模数据时,可能会遇到性能瓶颈,特别是在数据分片或分区后,进行主键查询时,问题更为突出。"MySQL数据库分表批量主键查询代理-mysql-partitions-proxy"项目就是为了应对这一挑战而设计的。这...
数据切分(Data Sharding)是一种常见的数据库优化策略,通过将大数据集分割成较小的部分,存储在不同的物理存储设备上,以达到提高性能和可扩展性的目的。数据切分可以分为水平切分和垂直切分两种: - **水平切分*...
"新浪基于MySQL的分布式数据库实践1" 分布式数据库实践是指在多个服务器上部署和管理数据库,以提高数据库的性能、可扩展性和可靠性。在这个实践中,新浪使用了基于MySQL的分布式数据库实践,实现了高性能、可扩展...
总的来说,Amoeba提供了一套完整的解决方案,用于在单机上配置多个MySQL数据库,并通过读写分离和数据切分策略优化数据库性能和扩展性。这种配置方式在处理大量并发请求和大数据量存储时尤其有用,但同时也需要考虑...
本教程将详细介绍如何将sqlite3数据库中的数据导入到mysql数据库中,这对于处理并发访问能力不足或需要更强大功能的数据库场景非常有用。以下是具体的步骤和注意事项。 ### 前言 sqlite3是一个轻量级的数据库系统,...
秒杀应用的MySQL数据库优化是一个重要的议题,尤其是在高并发、数据处理速度要求极高的场景下。这类应用常常面临巨大的压力,如瞬间涌入的大量请求、数据读写速度、以及资源的有效利用。本篇文章将深入探讨如何针对...
MySQL数据库工程师在面试时可能会遇到各种各样的问题,这些问题涵盖了MySQL的多个方面,包括但不限于数据库设计、SQL查询、性能优化、事务与并发控制、备份与恢复、安全性等。以下是一些可能的面试知识点: 1. **...
MySQL的水平和垂直切分是数据库优化的重要策略,主要用于应对数据量大、访问压力高的情况。这两种切分方法都是为了提高数据库的性能和可扩展性。 **垂直切分**是根据表中的字段来划分,目的是减小单个表的大小和...
本文深入探讨了在互联网背景下,MySQL数据库如何应对大数据量存储和访问的挑战。通过数据切分、路由规则设计、负载均衡和分布式数据访问层的构建,实现了系统的稳定性和扩展性。这些策略和实践对于构建大型互联网...