`
yangyiqian
  • 浏览: 115145 次
  • 来自: ...
社区版块
存档分类
最新评论

mysql数据库的数据切分

阅读更多
当构建大型网站时,因为种种原因会对数据进行切分(对种种原因我们下次再解释)。根据切分的规则,切分一般包括两个方面:垂直切分和水平切分。而根据切分的层次可以分为:机器级切分即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,但是不同区段的起点相差很大。

总之,数据水平切分,涉及到的问题还是很多的。关键是根据业务本身的需求,采取一种合适的切分策略。不要为了切分去切分。
分享到:
评论

相关推荐

    MYSQL 数据库水平切分的实现原理解析

    看过一篇文章,学到一些东西,和大家共享! 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。...通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。

    数据库分库技巧

    数据库水平切分的实现原理解析---分库,分表,主从...通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失

    MYSQL学习资料

    MySQL数据库扩展小记 mysql架构方案 MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with ...

    单KEY业务,数据库水平切分架构实践

    • 索引表法:数据库中记录login_name->uid的映射关系 • 缓存映射法:缓存中记录login_name->uid的映射关系 • login_name生成uid • login_name基因融入uid 运营后台侧,“前台与后台分离”最佳实践: • 前台、...

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

    数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)...可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据

    MySQL性能调优与架构设计

    , 架构篇则以设计一个高可用可扩展的企业级分布式数据库集群环境为目标,分析了多种通过 MySQL 实现这一目标的架构方式,包括可扩展设计和高可用设计两部分内容,如 Replication 的利用,数据切分,Cache 和 Search ...

    MySQL性能调优与架构设计.mobi

    主要包括可扩展和高可用两部分内容,可扩展部分包括设计原则、Replication 的利用、数据切分、如何使用 Cache 和 Search,以及 NDB Cluster等内容。高可用则主要包括 Dual Master、DRBD、NDB Cluster,以及系统监控...

    MySQL性能调优与架构设计(PDF)

    主要包括可扩展和高可用两部分内容,可扩展部分包括设计原则、Replication 的利用、数据切分、如何使用 Cache 和 Search,以及 NDB Cluster等内容。高可用则主要包括 Dual Master、DRBD、NDB Cluster,以及系统监控...

    MySQL性能调优与架构设计(中文版)

     第14章 可扩展性设计之数据切分  第15章 可扩展性设计之Cache与Search的利用  第16章 MySQL Cluster  第17章 高可用设计思路及方案  第18章 高可用设计之MySQL监控 附录A 实验测试Schema创建脚本 附录B...

    MySQL性能调优与架构设计.pdf

    主要包括可扩展和高可用两部分内容,可扩展部分包括设计原则、Replication 的利用、数据切分、如何使用 Cache 和 Search,以及 NDB Cluster等内容。高可用则主要包括 Dual Master、DRBD、NDB Cluster,以及系统监控...

    MySQL5.1性能调优与架构设计.mobi

    以MySQL数据库的基础及维护为切入点,重点介绍了MySQL数据库应用系统的性能调优,以及高可用可扩展的架构设计。 ●基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的备份恢复知识 ●性能优化...

    数据切分整合?有章法!

    《MySQL性能调优与架构设计》第14.5节“数据切分及整合方案”14.5 数据切分及整合方案通过前面的章节,已经清楚了通过数据库的数据切分可以极大地提高系统的扩展性。但是,数据库中的数据经过垂直和(或)水平切分...

    1-1+海量数据的存储与访问瓶颈解决方案-数据切分1

    如果单机数据库易于扩展,数据可切分,就可以避免这些问题,但是当前的这些数据库厂商,包括开源的数据库MySQL在内,提供这些服务都是需要收费的,所以我们转向一些第

    mysql海量数据存储和访问解决方案

    通过数据切分来提高网站性能,横向扩展数据层已 经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失。通过负载均衡策略,有效的降低了单台机 器的访问负载...

    MySQL大型分布式集群 龙果学院

    数据库中间件05-mycat的数据切分 00:13:50分钟 | 第35节 数据库中间件06-mycat的读写分离-01 00:11:16分钟 | 第36节 数据库中间件06-mycat的读写分离-02 00:24:06分钟 | 第37节 数据库中间件06-mycat的读写分离03...

    MySQL数据库优化之分表分库操作实例详解

    本文实例讲述了MySQL数据库优化之分表分库操作。分享给大家供大家参考,具体如下: 分表分库 垂直拆分 垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程...

Global site tag (gtag.js) - Google Analytics