这篇文章主要讲解了“MySQL分库分表的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql分库分表的概念”吧!
创新互联建站,专注为中小企业提供官网建设、营销型网站制作、自适应网站建设、展示型成都网站建设、网站建设等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。
分库分表的方式一般有两种:垂直拆分和水平拆分。接下来我们可以分别看看这两种分库分表方式:
垂直分库其实逻辑上会更容易理解,比如目前我数据库有用户相关的表如用户表,积分表,实名认证表,还有订单相关的比如商品表,拼团表,还有商品相关的商品表。如果全部表全部放在同一个数据库,由于数据库连接的匮乏以及磁盘IO等影响,所以性能肯定会收到一定的影响。这时候我们可以可以将用户相关的放在user数据库,商品相关的放在goods数据库,订单相关的放在order数据库。然后不同的数据库存放在不同的服务器上,这样还可以避免因为用户量越来越多导致数据库性能受到服务器瓶颈的影响。所以说分库实际上就是在多个服务器搭建多个不同的数据库,然后按照不同的业务逻辑将不同的表存放在不同的数据库。
垂直分表主要是表中数据列成百上千的数据表使用的,使用的方案是创建辅助表,将表中数据量较大或者不常用的数据库移动到辅助表,常用的字段留在原表中,这样就可以避免我们在查询大表的时候由于不常用的大字段影响查询的性能。
水平分表和垂直分表区别在于垂直分表针对的是列,将不常用的列拆分到辅助表。而水平分表针对的是表,在同一个数据库中创建多张一样的表,比如我们在order数据库中创建三张订单表order1,order2,order3,然后插入订单时将id对3取余,根据不同的值存入不同的订单表,但是由于水平分表是将数据表存放在同一个数据库,水平分表可以降低单标的数据量,有助于提高查询效率。如果业务量很大一样会受到服务器IO的瓶颈,所以我们一般更经常使用的还是水平分库分表。
水平分库分表实际上就是在多台不同的机器分别创建数据库和数据表,比如订单表我们可以在三台不同的机器上分别创建order数据库和order数据表,然后根据一定的逻辑将不同的数据存放到不同机器的数据库中。一般来说水平分库分表主要有以下几种拆分规则:
范围拆分:比如订单表通过id拆分,id在1到100000在服务器a的order数据库,id在100001到200000存放在服务器b的order数据库,以此类推。
地理拆分:将订单表按照不同地区将表中的数据拆分到不同服务器的order数据库中存储。比如可以按照省份来进行拆分。
取模拆分:取模就是刚才水平分表讲到的比如有三个订单表,可以将id对3取余,但是区别在于水平分库分表是将同样的数据库和数据表存放在不同机器,所以说可以有效缓解单机瓶颈问题。
时间拆分:根据时间来拆分表中的数据,可以将表中创建时间超过一年的数据拆分到其他数据库的order数据库存储,原表中只保留被查询概率较高的数据,而这部分数据往往都是近期才创建的,所以可以通过时间拆分实现冷热数据分离。
分区
分区是什么意思呢?分区实际上是指同一个数据表中不同行的数据记录到不同的分区中,每个分区都有一个.idb文件,所以说分区可以帮助我们将一个数据表拆分成几个更小的部分。Mysql只支持局部索引分区不支持全局分区,mysql每一个分区既保存了数据,又存放了索引。MySQL分区主要分为以下几种:
RANGE分区:RANGE分区主要用于日期列的分区,是基于连续区间的列值来进行分区的。RANGE分区也是最常用的分区方式。
LIST分区:LIST分区列的值是散列的,也正是由于分区列的值是散列的所以需要手动定义分区列的值。
HASH分区:HASH分区就是通过自定义算法将数据均匀分布到不同分区,保证所有分区中数据大致相同。HASH分区只支持整数分区。
KEY分区:key分区使用数据库自带函数进行分区。KEY分区可支持BLOB和TEXT列之外的数据列分区。
分区主要注意一点,如果要分区的表有主键或唯一键,则分区表的主键/唯一键必须包含分区键。分区的意义在于将一张大表根据分区条件分割成几个小表,但是对于数据来说仍然是一张表,可以改善大表的可伸缩性,可管理性,还可以提高数据库的效率。
分区的优点
与数据存放在单个磁盘相比,可以存储更多的数据。
对于那些已经失效的数据,通常可以通过删除对应的分区,来实现删除数据,这样比delete效率更高。
一些查询可以得到极大的优化,满足一个给定WHERE语句的数据可以只保存在一个分区内,这样在查找时就不用查找其他剩余的分区。
涉及聚合函数的查询,可以进行并行处理。意味着聚合函数查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
分库分表可以一定程度去除数据库的瓶颈,但是不可避免的分库分表会带来一部分问题,分库分表主要有两个问题:联表查询join操作困难和分布式事务的问题。
我们一开始单库多表的情况下使用join联表操作是非常简单的,使用一条简单的sql语句配上join就可以得到我们需要的结果,但是分库之后我们可能一次查询无法完成,我们可能需要先去服务器a查询用户信息,再去服务器b, c, d分别查询订单信息才能完成我们的联表查询功能,联表查询功能我觉得比较适合的一个逻辑是分别查询出我们需要的数据,然后代码方面在service层负责组装所有数据,最后再返还给客户端,这样虽然比较复杂,但是数据库的性能可以得到最大化。
进行分库操作之后,事务操作就变成分布式事务了,而之前在谈redis的时候特提到过分布式,我们都知道涉及到分布式逻辑都是比较复杂的,而且如果使用Mysql自带的分布式事务管理功能会导致性能大大降低,大概是单库的一成左右性能,所以方案一般有两种:使用分布式事务中间件比如Mycat或者在代码中业务逻辑进行控制,不过如果在代码中控制,可能会使系统更加复杂,可维护性比较低。
感谢各位的阅读,以上就是“Mysql分库分表的概念”的内容了,经过本文的学习后,相信大家对Mysql分库分表的概念这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
本文名称:Mysql分库分表的概念
地址分享:
http://kswsj.cn/article/ijcshj.html