当前位置: 首页 > 网络应用技术

有人问你什么是数据库表,然后直接向他发送本文

时间:2023-03-06 17:07:43 网络应用技术

  分支表是在高并发和数据方面的技术优化解决方案,这也是一个非常高频的访谈问题。很少有人能回答这个问题。

  然后,本文试图一次告诉数据库表。

  首先,我们需要知道,SO称为“数据库表”根本不是一回事,而是三件事,而他们必须解决的问题也不同。

  这三件事“仅分为库,不论表格如何,“只有表,没有仓库”和“现有的库和桌子”。

  库是什么时候?实际上,分支库主要解决大型并发问题的问题。因为一旦出现并发量,数据库可能会变成瓶颈,因为数据库的连接数量受到限制。尽管可以进行调整,但并非无限。

  因此,当数据库读取或写入太高时,它将导致数据库连接不足,并且您需要考虑分支库。通过增加数据库实例,提供了更多可用的数据库链接来增强系统并发。

  更典型的子饰面场景是,当我们进行微服务时,我们将根据业务边界的数据库将每个业务的数据与单个数据库分开。单独将其单独放在单独的数据库中。

  有时您也可能需要将历史命令转移到历史图书馆中。这也是该分支机构的特定做法。

  它何时分配?分支库主要解决了大量并发量的问题。实际上,表主要解决了大量数据的问题。

  如果您的单表数据量非常大,因为复合材料不高,则数据量连接可能足够,但是存储和查询的性能遇到了瓶颈。当您进行大量优化时,您无法提高效率,您需要考虑这样做。

  通过将数据分成多个表以减少单个表的数据量,从而提高了查询速度。

  通常,我们认为,在单表行的数量超过500万行或单个桌子容量超过2GB之后,有必要考虑制作拆分表。它少于数据量。在绩效问题的情况下,建议您通过其他优化来解决它。

  数据库和表是什么时候?那么库的划分何时?现在是时候解决大量并发量的问题了,但也解决了大量数据的问题。在正常情况下,高和大数据量的问题同时出现。因此,我们经常遇到需要同时执行拆分表的情况。

  因此,当您的数据库链接不够,并且单个表上的数据量也会引起大量查询,则需要执行现有库和表。

  当涉及到分支表时,有必要涉及如何进行分裂的问题。

  分裂时通常有两种方法,即水平分裂(水平拆分)和垂直分裂(垂直拆分)。如果我们有一个表格,如果我们有一个表格,如果我们将多个字段拆分到多个表格,这是垂直拆分。表格中的不同记录放在不同的表中,这是水平拆分。

  水平拆分的结果是,数据库表中的数据将分散到多个平板电脑,从而减少了每个平板电脑中的数据数。

  由于垂直分裂的结果,数据库表中数据中的数据数将减少,这将减少每个平板电脑中的数据存储。例如,我可以将产品详细信息信息,价格信息,库存信息,库存信息,库存信息,等到不同的表。

  此外,分为我们谈论的不同业务的多个数据库的情况实际上是一种垂直分裂。

  在子图表的过程中,我们需要有一个用于表的字段,例如根据用户表,根据时间表和区域表。用户,时间和区域是SO-称为研讨会领域。

  然后,选择此细分字段时,您必须注意根据实际业务状况进行仔细选择。

  例如,当我们想按交易订单制定仪表时,我们可以选择很多信息,例如买方ID,卖方ID,订单号,时间,区域等。我应该如何选择?

  通常,如果有特殊要求(例如每月摘要和区域摘要),我们通常建议您使用买方的ID.,因为这可以避免关键问题-DATA倾斜(热数据)。

  买家仍然是卖家,首先,为什么我们说他们不跟随卖方?

  因为我们知道E -Commerce网站上有很多买卖双方,但是大型卖家可能会产生许多订单,例如Suning Tesco,Dangdang等。同一卖家将分为同一张桌子。

  然后,它将使一些表的数量非常大,但是某些表的数据量很小,这是倾斜的数据。该卖方的数据变成热数据,随着时间的增加,卖方的所有操作都将变得非常慢。

  但是,买方的ID并没有此类问题,因为买方购买数据倾斜并不容易。

  但是,应该指出的是,我们说,根据买方的身份证,可以保证同一买家的所有订单都在同一张桌子中,而不是为每个买家分开分配表。

  当我们制作桌子时,我们可以设置某些规则。例如,我们想要1024个表,因此我们可以使用买方的ID或买家将其存储在相应数字的相应数字中。

  如果卖方的查询是基于买方的ID,该怎么办,如果卖方的查询该怎么办?

  首先,我们必须在业务背景中讨论业务问题。

  1.买家检查自己的订单

  2.卖方检查自己的订单

  3.平台上平台的顺序。

  首先,我们使用买方ID制作桌子。然后,当买方询问时,我们绝对可以将买方的身份证列出。我们只是直接转到相应的表查询。

  如果卖方检查了怎么办?如果卖方查询,您还可以带上卖方的身份证。然后,我们可以使用基于准真实 - 时间同步卖家的基于卖方的卖方分段表。该表仅用于查询解决卖方查询问题。

  从本质上讲,这是利用空间改变时间的实践。

  我不知道您是否在这里看到这个问题:您是否同步卖方手表,这是否会带来大卖家的热门问题?

  首先,我们说卖方的尺寸来自于此,但实际上,所有写作操作仍然需要写入买方表,但是需要实时同步的解决方案与卖方表。该卖方的手表没有商业写作操作,只有阅读操作。

  因此,该卖方的图书馆只需要具有较高的性能读数,因此在这种情况下可能有很多选择。示例PolardB,Lindorm和其他数据库。这些数据库可以是大量数据并提供高性能查询。

  而且,大卖家通常是可以识别的。事先,大卖家提前针对他的订单,然后按照某些规则将其分成多个表。写作操作。

  在订单查询中该怎么办?以上是有交易和卖方的情况。如果直接检查订单号,该怎么办?

  解决此问题的解决方案是,当生成订单号时,我们通常将表设置为订单号,因为生成订单时,我们必须知道买方ID是。订单数中的价值。这是如此被称为“遗传方法”

  这样,在查询订单号时,分析此号码并直接转到相应的表查询。

  至于某些人询问其他查询,如果没有交易者ID或订单号,它实际上是低频查询或非核心功能查询,那么您可以使用诸如ES之类的搜索引擎方案来解决它。不要详细介绍。

  选择分割字段后,如何根据此分割字段准确地将数据分为表格?

  这就是表算法需要做的,但是无论算法如何,我们都需要确保一个前提,即相同的研讨会字段。处理此算法后,结果必须一致且不可变化。

  在正常情况下,当我们抓住订单表时,例如,如果我们想分为128表,我们得到的128个表应该是:order_0000,order_0001,order_0002,order_0002 ..... order_0126,order_0127

  通常的表算法具有以下内容:

  直接在库中取模时,我们可以知道要提前分配多少库和表格。因此,简单是使用模具的方法。

  例如,如果我们要将其分成128个表,则可以使用整数将模具占128。如果结果为0002,则将数据放在订单_0002的表中。

  哈希成分。如果表字段不是数字类型,但是如果字符串类型我该怎么办?一种方法是要有一个层来采用模具,首先将表格的哈希拿走,然后再进行模具。

  但是,应该注意的是,Java中的哈希方法获得的结果可能为负,并且需要考虑这种负面情况。

  一致性哈希的前两种方法相对较好,可以使我们的数据平均分配到多个平板电脑中,但是仍然存在缺点。

  也就是说,如果需要平板电脑的总数,则需要重新计算表的总数,并且需要数据迁移。

  为了解决扩展问题,我们可以使用一致的哈希来制作表。

  一致性哈希可以使用常用的哈希算法将相应的键哈希放在带有2^32 -square节点的空间中,以形成一个偶然的封闭环。增加服务器的位置和逆时针方向上的第一台服务器将受到影响。

  当涉及到分支表时,它将扩展分布式系统中唯一的主密钥ID的生成问题,因为在单个表中,我们可以使用数据库主键来制作独特的ID,但是如果制作了数据库,则制作了平板电脑桌,多片在多个平板电脑中。他们肯定的主钥匙肯定会冲突。然后没有全球唯一性。

  那么,如何生成唯一的ID?有几种方法:

  UUID中的许多人对Uuid并不陌生。它可以实现唯一的全球和简单方法,但是我们通常不建议使用他来执行独特的ID。而且没有业务含义,我根本无法理解。

  基于单个表,由多个单表生成的自我插件主键是冲突的,但是如果表中的所有主键都是从同一表生成的所有主键,则足够了。

  当所有桌子都需要主键时,它们在此表中获得了自我启示的ID。

  这可以是唯一的一个,也可以实现,但是问题在于,该表成为整个系统的瓶颈,并且也存在单点问题。一旦他悬挂,整个数据库就无法编写。

  基于多个单个表+步长的自添加键,以求解单个数据库的瓶颈和单点故障问题,我们可以介绍多个表以共同生成。

  但是如何确保不重复多个表中生成的ID?如果我们可以实现以下一代方法:

  通过示例1生成的ID从1000到1999年结束。通过示例2生成的ID从2000年开始到2999。通过示例3生成的ID从3000到3999结束。4从4000开始到4999年末。

  这可以避免ID的ID。如果第一例ID在1999年使用?然后生成一个新的起始值:

  通过示例1生成的ID从5000到5999结束。通过示例2生成的ID从6000到6999结束。通过示例3生成的ID从7000到7999。4从8000开始到8999年底。

  我们将步长设置为1000,以确保每个表中的主键的起始值不同,并且1000之间的差异为1000,而不是当前的最大值。

  雪算法雪花算法也是一个更常用的分布式ID来生成。它具有独特的,增加,高可用的特征。

  雪花算法生成的主要键主要由4个零件,1位符号位,41位时间戳位,10位工作过程位和12位序列号组成。

  时间邮票占据了41位,这是准确的毫秒,可以容纳约69年。

  工作过程占据了10位,其中高级别5bit是数据中心ID,低级别5bit是工作节点ID。制作更多可以容纳1024个节点。

  序列号占12位。每个节点每毫秒0毫秒均连续累积,最高为4095,总共可以生成4096个ID。

  因此,雪花算法最多可以生成1024 x 4096 = 4194304唯一ID在同一毫秒内

  选择子场字段和表算法后,如何实现这些功能,您需要做什么?

  我们如何处理像单个表一样的分支表的数据?这需要分支表的工具。

  目前,市场上有三个主要的开源框架,即Sharding-JDBC,TDDL和Mycat

  现在称为sharding-jdbc(shaardingsphere(sharding-jdbc,sharding-proxy和sharding-sidecar。)。它定位为由轻量级Java框架提供的额外服务,并在Java.it的JDBC层提供了java.it层。直接连接到数据库,以JAR软件包的形式提供服务。它不需要其他部署和依赖项。它可以理解为JDBC驱动程序的增强版本,该版本与JDBC和各种ORM框架完全兼容。

  打开原始地址:https://shardingsphere.apache.org

  TDDL TDDL是用于访问开源数据库的中间件。它集成了分支表的功能,读取和写作分离,重量部署和动态数据源配置。包装JDBC的数据源为用户提供了基于统一的客户端的使用。

  开源地址:https://github.com/alibaba/tb_tddl

  mycat mycat是一个分布式关系数据库中间件。它支持分布式SQL查询,与MySQL通信协议兼容,支持具有Java EcoSystems的各种后端数据库,并通过数据shards提高数据查询处理功能。

  开源地址:https://github.com/mycatapache/mycat2

  将数据库分为表之后,会有很多问题。

  首先,在制作拆分表之后,所有阅读和写作操作都需要与表一起使用,以便您可以知道哪个库以及要查询数据的库。如果不带它,则必须支持完整的桌子扫描。

  但是,当平板电脑(但是制作拆分表之后),无法进行扫描操作时,更容易扫描整个桌子。如果要扫描手表,则必须扫描所有物理表。

  另外,一旦我们想从多个数据库中查询或编写数据,就可以做很多事情。例如,不支持交叉 - 额线交易。

  因此,将拆分表分为表之后,由不支持交易引起的数据一致性问题。

  其次,在制作拆分表之后,在上一个单个表中的操作,排序等是无效的。

  简而言之,尽管分支表可以解决一些大数据量(高和合并)的问题,但它也会带来一些新问题。因此,在进行数据库优化时,仍然建议您首先选择其他优化方法,最后是考虑分区表。

  以上,本文介绍了分区表的某些原因,以及如何制作数据库,并讨论表格和表格的更为关键表和表格的问题。

  最后,需要注意的是,分支表将引入一些新问题。这些问题的解决方案成本并不低,因此在进行技术选择时,您还必须评估这一方面。

  原始:https://juejin.cn/post/7101134637631537183