Mysql在数据量大的情况下,会遇到水平分表的情况。
1. 根据业务属性拆表
这种分表方式的算法大致是取模,hash,md5等。
用业务属性拆表,业务关系复杂的情况下,如果要根据其他条件查询,其他的条件都必须和这个属性关联起来,查询条件必须带有这个属性。
例子:
用户profile表根据用户ID取模进行水平拆分。
社区里有群组,群组里有应用,应用有各种类型。可以用群组ID,应用ID拆表。
问题:
根据某个条件查询时无法获取拆表的属性
1) 条件中含有分表的信息
比如用户在某网站下了订单,我们根据用户ID对订单进行了分表,这样用户可以方便地查询他所关联的订单。但用户投诉时,客服需要根据订单号查询订单,订单号中可以含有分表的信息,比如订单拆分成100张表,订单号中可以有两位用来表明该订单处于哪张表中
2) 用key-value store存储对应关联
原理是用key value store做索引表
3) 数据冗余
需要关联的表可以进行数据冗余。避免了查询。
例子:
购买礼品。购买虚拟礼品时,我们根据了购买者的ID进行了拆表,同时订单号中也含有了分表信息。但是用户还可能根据被赠送方进行查询,这时我们可以在购买成功后为被赠送方冗余生成一条记录。
4) 缓存,NOSQL
和数据冗余类似。例子中提到的群组应用的拆表例子,我们已经按照群组ID和应用类型进行了分表。但是当我要查询最近所有类型的应用时,就遇到困难了。我们需要把该群组的所有应用类型都查询一遍,而且还要再进行排序,分页等等。其实,可以用缓存的方式存储最近几百条应用。
2. 根据时间拆表
当表的关系比较复杂时,无法根据某个维度进行分表。但是有明显的时效性。
例子:
想必大家都用微薄,某人发的微薄,会被推送到千家万户。所以某条微薄是无法根据用户ID进行分表查询。而微薄是有很强的时效性的。一年前的默认的动态信息是不会再关心的。我们把微薄按时间分表,三个月一张表。而行级缓存(memcached)只存储了一个月。用户微薄收件箱(微薄ID列表)一般都是限长的。当缓存服务器重启或不命中时,需要查询Mysql,mysql按时间分表,缓存不命中的情况下,大部分情况下都是查近三个月的微薄。所以近1年的微薄我们可以存储在物理资源比较好的数据库服务器上。
3. 根据自增长ID拆表
这种分割法不是取模分,而是每张表存指定量的数据。如果数据量到了,就存放到新表中。这样可以完全控制每张表的数据量。关系非常简单并且有时效性的情况下可以用。
4. 数据迁移的方式
当一些很久之前的数据,很少再查询。比如员工工资表,我们可以只存今年的工资情况。而历史数据我们可以迁移到一张salary_old表中,保证数据不会丢失。但也可以用来查询。
分库的原理也类似。
- 浏览: 305871 次
- 性别:
- 来自: 北京
最新评论
-
kongdong88:
Netty简单应用与线上服 ...
用Netty实现的一个简单的HTTP服务器 -
phili1999:
兄弟,此乃Eclipse的bug,至今未解决,可见国人地位低啊 ...
eclipse的控制台在UTF-8编码下键盘输入BUG问题,请问有谁能解决 -
xiaguobing:
谢谢分享啊
MetaQ初探 -
ih0qtq:
...
java性能编码规范整理
相关推荐
mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with Memcached –安装 数据切分及整合方案 数据库水平切分的实现原理解析 innodb max dirty...
方案一:使用myisam进行水平分表优化 方案二:使用mysql分区优化 一:Myisam水平分区 1、创建水平分表 user_1: -- 创建水平分表 create table user_1( id varchar(50) PRIMARY key COMMENT '主键id', user_name ...
在我上一篇文章中说过,mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) ...
2. **水平分表(Hash分片)**:根据某个字段的值(如用户ID)进行哈希运算,将数据均匀分布到多个表中。例如,假设我们有1000万用户,可以创建10个子表,用户ID为1-100万的用户在表1,100万-200万在表2,以此类推。...
### MySQL分区分表方案实践手册知识点详述 #### 一、MySQL分区简介 数据库分区是一项重要的物理数据库设计技术,主要用于优化数据库性能并简化数据管理。MySQL的分区主要包括两种形式:水平分区和垂直分区。 - **...
本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...
2. **水平分表(Sharding)**:依据一定的规则(如哈希取模、范围划分等)将一个大表拆分成多个小表,分布到不同数据库或同一数据库的不同表中。这样每个表的数据量减少,查询性能得以提升。 **三、分库分表策略** ...
数据库分库分表的几种方式主要包括垂直分库、垂直分表、水平分库和水平分表。垂直分库是按照业务的不同进行数据库的分割,每个数据库只包含部分业务的数据;垂直分表是将一个表按照字段划分成多个表,通常按照数据的...
为了提升MySQL数据库的性能和可用性,常采用的策略是数据库分库分表,其中可以分为垂直分库、垂直分表、水平分库、水平分表等方法。 垂直分表是针对数据库表中的列进行拆分,将一张大表拆成若干个结构更小的表,以...
一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表属于...
分表分库,也称为数据库水平扩展,是应对海量数据的常用策略。当单个数据库表的数据量过大时,会导致查询效率降低,甚至影响系统的整体性能。通过将一个大表分成多个小表,或者将数据分散到多个数据库实例中,可以...
Mycat作为一款开源的分布式数据库中间件,因其强大的分库分表能力,被广泛应用于Java开发环境中。本文将详细介绍如何使用Mycat进行MySQL集群配置,特别是如何实现按日分库和按月分库。 首先,理解Mycat的核心功能。...
分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高系统的并发处理能力和整体性能。 **分库** 是将一个大数据库拆分成多个小数据库,每个数据库负责一...
分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...
MySQL分库分表是一种应对大数据量和高并发场景下的数据库优化策略,旨在提高数据库系统的性能、可用性和可扩展性。MYCAT(曾用名:Maatkit)是一款开源的数据库中间件,它允许开发者将MySQL数据库集群化,实现分库...
水平分表是根据行数据来划分,而垂直分表则是根据列数据来拆分。 在Java中实现分库分表,通常需要借助中间件或库,例如ShardingSphere、MyCat等。这些工具提供了完善的分片策略,支持动态数据源路由,可以透明地...
Heisenberg是一款开源的MySQL分库分表中间件,它能够帮助开发者实现数据库的水平扩展,提升系统的处理能力和可用性。 **一、Heisenberg简介** Heisenberg取名自量子力学中的海森堡不确定性原理,寓意其在数据库分...
分享一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表...