准确的电话号码和 WhatsApp 号码提供商。 如果您想要电子邮件营销活动列表或短信营销活动,那么您可以联系我们的团队。 电报: @xhie1

超越 Rails 抽象:深入了解数据库内部

抽象是美妙的事情。看看Rails:我们可以用相对较少的代码行来实现大量的功能。例如,我不一定需要了解大量有关数据库如何实现的知识才能快速启动和运行。 这种与核心功能隔离的缺点是开发人员无法学习他们可能应该学习的所有内容。就在上周,我才能够通过删除索引来解决缓慢的查询问题,因为沿线有人不了解基数或索引如何工作。你能自己实现一个数据库吗?让我们深入研究另一项我们认为理所当然的技术! 索引如何运作? 我们期望在查询数据库时相对较快的查找时间。如果您要实现一个函数来提取两个数字之间,因为它在线性时间内执行 ( O(n))。

您需要的是一种按指定顺序存储记录的方法,以加快访问速度。像二叉搜索树(BST) 这样的结构正是这样做的,它确保任何给定记录都大于其左子树中的所有记录,但小于其右子树中的所有项目。这使我们的搜索时间缩短了很多O(log n),并且是数据库索引的支柱。 BST 让我们失望的是我们很少需要特定的记录。相反,我们更有可能希望所有记录都符合特定标准。一个简单的解决方案是再次检查每条记录,这使我们回到线性时间,或者O(n)。我们需要一种方法来按顺序存储所有记录, 在研究这篇文章时,我对这种方法的低效感到震惊。

 

为什么使用太多索引是一个坏主意

 

表面上,所需要的只是对有序列表进行快速索引——这项任务非常适合犯罪未充分利用且鲜为人知的数据结构“跳过列表”。事实证明,虽然 B+ 树通常比其他数据结构中的同等操作需要更多的 CPU 工作,但它们擅长从磁盘到内存的传输需求少得多,这是一个天 WhatsApp 号码数据 然的瓶颈。这篇Google 博客文章提供了一些关于原因的背景信息。此外,B+ 树在最坏情况下也具有效率——当数据集较大时,这是一个重要因素。 为什么使用太多索引是一个坏主意? 让我们想象一下删除数据库中的一行。这意味着我们还需要删除 B+作时,应用索引的任何字段都必须重新平衡树。

可能选项很少(例如布尔值、三角值等)的字段被认为具有低基数。这是一篇很棒的 IBM 文章,其中警告了低基数索引字段的陷阱,但其要点是您应该避免这样做。然而,有趣的是,我之前已一如既往地配置文件配置文件! 查询解析器 让我们采用一个标准查询并跟踪它的旅程接下来,查询解析器检查数据库元数据:您的表是否存在?该专栏存在吗?您即将执行的果一切看起来都不错,那么查询解析器会将树传递到下一步。 查询重写器 我们的树成功构建还有许多其他规则,但最终目标是确保查询执行所产生的时钟周期保持在最低限度。

查询重写器

最终结果是一个查询计划,理论上,它是一个经过高度优化的高效 SQL 查询。但是数据 BJB目录 库引擎如何知道哪些是最有效的连接等等?为此,我们需要快速绕道…… 统计数据 一个好的数据库引擎会收集统计数据。这些信息包括表中的记录数、列中有多少个不同值、最小值/最大值等。这是用于查询优化过程的,也是查询速度很快的原因。例如,如果您尝试将一个包含一百万行的表连接到一个包含一百行的表,那么连接记录较少的表会快得多。它实际上比这更深入,计算包含分位数和标准差等信息的直方图,但你明白了。 没有什么比错误的统计数据更不利于快速查询了。

如果查询优化器认为有 200 条记录,而实际上有 2 亿条记录,并在此基础上计算了直方图和统计信息,则这可能是查询执行的分钟和小时之间的差异。因此,定期触发统计收集非常重要。 查询执行器 最后,是时候执行我们的查询了!查询管理器检查它是否有足够的资源(内存和CPU),如果允许,则开始执行。首先,它将检查内存中的数据缓存(请记住,内存比磁盘快得多)并触发缓存管理器预取所需的下一个数据块,如查询计划所示。它将丢弃不再需要的数据,我没有在这里介绍。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注