mysql 数据库分库分表

听到分库分表我想很多都对这个词不陌生,因为从事开发工作的小伙伴,或多或少都听过这个词的。
1、数据库分库分表有什么作用呢?
举个例子:我的demo数据库中的table1表有列:30 行:4000W,在这张表中查询一个数据是很耗费时间和性能的吧,分库分表就是来解决这个问题的。

2、分库分表,先说分表
(1) 减少数据表的体积 - 拆表
还是上面那个例子,在上面的例子中,列有30列,那么我们就分析这些列中哪些是索引列(能够作为查询条件的列),哪些是数据列(不会作为查询条件的列),将不会作为查询的列单独存放在一张表中且这张表的id主键与主表中的主键是一对一的关系,达到了减少主表体积的目的。

(2)减少数据表的体积 - 分表
依然是上面的例子,主表数据行是:4000W 行, 那么我们执行查询的时候是直接在4000W行数据中去寻找目的数据,这样的效率是极其低下的,且也很耗费性能。 那么我们怎么去优化呢?
很简单,我们再建一张和主表结构一模一样的数据库表,并分析,哪些数据是经常会被访问的,哪些数据是不经常会被访问的。将经常会被访问的数据放在table1,不经常访问的数据放在table2。话说到这里可能有人会问为什么不直接将两张表中的数据内容联合一起查询呢。

select * from (select * from table1 where 1) a inner  (select * from table2 where 1) b where id = xx

思路没有问题,但这种查询效果还不如将所有的数据放在一张表中进行查询,首先我们来分析下 (select * from table1 where 1) a 将table1中所有的数据查询出来放在内存中并命别名为表a,再连接 (select * from table1 where 1) b 将table2中所有的数据放在内存中, 光是这个两张表查询的结果所放在内存中所占用的空间就让人无法接受。
所以最好的查询效率是什么呢?
根据id的值进行查询。
比如小于2000W的id 在数据表table2中进行查询,大于2000W的数据在数据表tabl1中进行查询。分表了吧,查询速度一下子就上去。如果要支持更多的数据库表就设置表id的起始值为自定义的值(注意,id值一定不要和其它分表的id值冲突,要保证唯一性)

alter table table3 AUTO_INCREMENT=60000000

其中table3为表名

3、分库
我认为的分库不仅是分数据库,甚至连物理机也是分开的,假如数据库A在服务器A上,那么数据B就在服务器B上。当前面的所说的内容已经不能再满足我们的需求了(查询速度依然很慢,这个问题也许是由迸发量很高产生的,也有可能数据库体积太大,或是一些其它原因造成的问题。),那就分库,分库最本质的目的是让不同的查询在不同服务器上跑,达到一种负载均衡的目的。
在这里插入图片描述
由此,我们可以获得一个高性能的数据仓库,数据的快速实时存取。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值