当前位置: 首页 > 科技观察

什么是数据库的分库分表?_0

时间:2023-03-14 17:13:07 科技观察

阿奋认为,现在很多开发者都喜欢研究一些新技术,但能否真正将数据应用到公司的环境中,就不好说了。毕竟有些东西是要用的。一旦出现问题,就会引发一系列的生产事故。今天阿粉就来学习一下Sharding,也就是分库分表的实战。下面我们来了解一下什么是分库分表,什么是Sharding。什么是分库分表分库,很明显就是把一个数据库分成多个数据库,部署到不同的机器上。分表是指将一个数据库表分成多个表。那为什么要分库分表呢?为什么要分库分表?首先我们要明确一个问题,单一的数据库是否能够满足公司目前线上业务的需求,比如我们的用户表可能有几千万,甚至上亿的数据,阿芬刚才说了有可能,如果有这么多User,那肯定是大公司,所以这个时候,如果不分表或者分库,那么数据上来的时候,一不注意,磁盘容量单机的MySQL会爆,但是如果拆分成多个Database,磁盘占用率会大大降低。这样就降低了磁盘使用率。这是以硬件的形式来解决问题,就像阿粉一样。如果你的数据量很大,这个时候,如果SQL没有命中索引,就会导致一种情况。查这个表的SQL语句直接把数据库搞垮了。即使SQL命中了索引,如果表的数据量超过1000万,查询速度也会明显变慢。这是因为索引一般是B+树结构。如果数据有几千万级,B+树的高度会增加,查询自然会变慢。当然,这是题外话。那么就要说说如何进行分库分表的操作了。今天阿粉就来说说如何进行分库分表。分库分表方案分库分表方案无外乎两种,一种是垂直切分,一种是水平切分。但是总有开发者不清楚什么是垂直拆分和水平拆分,为什么要垂直拆分,为什么要水平拆分,什么时候选择垂直拆分,什么时候选择水平拆分。有人说垂直切分就是按照业务切分数据库。同一类业务的数据表拆分到一个独立的数据库中,另一类业务的数据表拆分到其他数据库中。有些人不明白这一点。其实垂直拆分是有划分的。上面的描述是针对垂直拆分数据库的,可能很多人难以理解。但如果是垂直拆分表,那么90%的人肯定能看懂。我们有另一个Order表,其中有很多记录。比如我们设计这么一个简单的表格。字段如下。idorder_idorder_dateorder_typeorder_state1cd96cff0356e483caae6b2ff4e878fd62022-06-1113:57:11支付宝12e2496f9e22ce4391806b18480440526a2022-06-1214:22:33微信239e7ab5a1915c4570a9eaaaa3c01f79c12022-06-1215:21:44现金2以上是我们的简化版Order表,如果我们想要垂直切分,sowhatshouldbedone?Directlysplitinto2tables.Atthistime,justonecopyis2,andsplitintotwotableswithaclick?Order1idorder_idorder_date1cd96cff0356e483caae6b2ff4e878fd62022-06-1113:57:112e2496f9e22ce4391806b18480440526a2022-06-1214:22:3339e7ab5a1915c4570a9eaaaa3c01f79c12022-06-1215:21:44Order2idorder_typeorder_state1支付宝12微信23现金2这时候我们的主键ID保持的时一致的,而这个操作,Itistheoperationofverticalsplittingandsub-table.Sincewesaidverticalsplits,theremustbehorizontalsplits.Whatisahorizontalsplit?Infact,ifitissplithorizontally,thereisreallyonlyonesentence.Splitthedatabaseaccordingtothedata:splitthedataofatable(accordingtothedatarow)intomultipledifferentdatabases.Thetablestructureofeachdatabaseisthesame.Eachdatabasehasonlypartofthedataofthistable,whenTheamountofdatainasingletableistoolarge.Ifyoucontinuetousehorizontaldatabasepartitioning,thenumberofdatabaseinstanceswillcontinuetoincrease,whichisnotconducivetosystemoperationandmaintenance.Atthistime,horizontaltablepartitioningmustbeused.Splittablehorizontally:distributethedataofonetable(accordingtodatarows)tomultipletablesinthesamedatabase,andeachtablehasonlypartofthedata.Let'stakealookatwhatitlookslikeiftheOrdertableissplithorizontally.Order1idorder_idorder_dateorder_typeorder_state1cd96cff0356e483caae6b2ff4e878fd62022-06-1113:57:11支付宝12e2496f9e22ce4391806b18480440526a2022-06-1214:22:33微信2Order2idorder_idorder_dateorder_typeorder_state39e7ab5a1915c4570a9eaaaa3c01f79c12022-06-1215:21:44现金2实际上就是水平的把表数据给分成了2份,这么看容易理解吗?分库分表带来的问题事务问题首先,分库分表最大的隐患就是事务的一致性。当我们需要更新的内容同时分布在不同的库中时,必然会出现跨库事务问题。原来在同一个数据库操作时,可以控制本地事务。分库后,一个请求可能需要访问多个数据库。如何保证交易的一致性,目前还没有简单的解决方案。无法联表还有一个问题就是无法查询联表,因为,一些原本在一个库的表分布到多个库,而这些数据库可能不在同一台服务器上,所以无法关联与查询。因此,对应的业务代码可能会更多。分页问题分库并行查询时,如果使用分页,各库返回的结果集是乱序的。只有多个数据库中的数据必须先进行查询,然后在内存中根据排序字段进行排序。如果查询结果过大,也是非常耗费资源的。阿芬之前用过一次分页,可以直接让线上的CPU瞬间出现峰值。所以,要小心。目前流行的分库分表技术有两种,一种是MyCat,一种是Sharding-jdbc,两者都可以分库。MyCat是数据库中间件,Sharding-jdbc是jar包提供服务的jdbc框架。如果非要让阿粉选择,那么阿粉肯定会选择最方便快捷的操作方式,那就是jar包的方式。Mycat和Sharding-jdbc的实现原理也不一样。Mycat原理中最重要的动词是“拦截”。它拦截用户发送的SQL语句。缓存分析等,然后将这条SQL发送到后端真实的数据库,对返回的结果进行适当的处??理,最后返回给用户。Sharding-JDBC的原理是,当接收到SQL语句时,会执行SQL分析=>查询优化=>SQL路由=>SQL重写=>SQL执行=>结果合并,最后返回执行结果。