MySQL-为什么不索引每个字段?

最近我学到了索引的神奇之处,性能也得到了显著改善。然而,据我所知,我似乎找不到这个问题的答案。

索引很棒,但是为什么不能索引所有的字段来使表格变得非常快呢?我相信有一个很好的理由不这样做,但如何在一个30字段表中的三个字段?30英里内只有10英里?一个人的底线应该是什么,为什么?

41050 次浏览

你必须平衡 CRUD 的需求。对表的写入变得缓慢。至于在哪里划线,这取决于如何访问数据(排序过滤等)。

索引占用内存(RAM)中的空间; 索引太多或太大,数据库必须在磁盘之间交换索引。它们还增加了插入和删除时间(必须为插入/删除/更新的每个数据片段更新每个索引)。

您没有无限的内存,所以所有索引都可以放入 RAM = good 中。

您没有无限的时间。只索引需要索引的列可以最大限度地减少插入/删除/更新的性能损失。

请记住,每次更新、插入或删除行时,都必须更新每个索引。因此,索引越多,写操作的性能就越慢。

而且,每个索引都会占用更多的磁盘空间和内存空间(当调用时) ,因此它也可能会降低读操作的速度(对于大型表)。 看看这个

索引将占用驱动器和内存分配的更多空间,同时也大大提高了性能。不幸的是,当它达到内存限制时,系统将放弃驱动器空间并冒性能风险。实际上,您不应该索引任何您可能认为不涉及任何类型的数据遍历算法的字段,无论是插入还是搜索(WHERE 子句)。但如果不是这样的话,你应该这么做。默认情况下,必须索引所有字段。您应该考虑取消索引的字段是,如果查询只被版主使用,除非它们也需要速度

对表中的所有列进行索引并不是一个好主意。虽然这将使表的读取速度非常快,但是写入速度也会变得非常慢。对每个列都建立索引的表进行写操作将涉及将新记录放入该表中,然后将每个列的信息放入其自己的索引表中。

这个答案是我个人的观点,我用我的数学逻辑来回答

第二个问题是关于边界在哪里停止,首先让我们做一些数学计算,假设我们有 N 行与 L 字段在一个表中,如果我们索引所有的字段,我们将得到一个 L 新的索引表,其中每个表将排序在一个有意义的方式索引字段的数据,第一眼如果你的表是一个 W 权重它将成为 W * 2(1泰拉将成为2泰拉)如果你有100个大表(我已经在项目中工作,其中表的数量约为1800表)你将浪费100倍这个空间(100泰拉) ,这是远远不明智的。

如果我们要在所有的表中应用索引,我们必须考虑索引更新是否是一个更新触发器,所有索引更新是否是一个选择所有无序等价的时间

由此我得出结论,在这种情况下,如果你将失去这个时间,最好是在一个选择或更新中失去它,因为如果你将选择一个字段没有索引,你不会触发另一个选择的所有字段没有索引

索引什么?

外键: 是必须的

主键: 我还不确定是否有人读了这个可能对这个案件有帮助

其他字段: 第一个自然的答案是剩余字段的一半为什么: 如果你应该索引更多你离最佳答案不远如果你应该索引更少你离最佳答案也不远因为我们知道没有索引是坏的,所有索引也是坏的。

从这3点我可以得出结论,如果我们有由 K 键组成的 L 字段,那么极限应该在接近 ((L-K)/2)+K的某个地方或多或少地靠近 L/10

这个答案是基于我的逻辑和个人价值观

首先,至少在 SAP-ABAP 和后台数据库表中,我们可以为所有需要的索引字段创建一个索引表,我们将只有它们的地址。因此,其他与 SQL 相关的软件数据库系统也可以使用一个表对所有字段进行索引。

第二,写作表现如何?例如,一家公司在一天内记录了50个销售订单。假设有一个表 VBAK 销售订单头表,其中有30个字段,例如每个字段有20个 CHAR 长度。.

我可以在几秒钟内写到真正的表,但是其他索引表可以在后台工作,同时一个报告被尝试运行,对于这个报告,当索引表被搜索时,可能有一个逻辑-用于数据库编程-一个索引写入过程正在继续并等待它结束(5个销售订单同时被记录,例如,可能需要5秒钟)。.因此,一个运行报表可以等待5秒,然后运行5秒,总共10秒。.

如果没有索引,正在运行的报表不会等待5秒钟来写入性能... ... 但是可能会运行40秒... ..。

那么,写性能的意义是什么呢? 没有人同时写数千条记录。但是读它们。

读取第二个表意味着: 有所有已经排序的字段。我选择了3个字段,我可以找到我需要搜索这些数据的排序集,然后我把它们... 什么内存,什么内存它只是一个复制的索引表,每个字段地址数据只有一个数据。.什么记忆?

我认为,这是软件公司向客户隐瞒的一个秘密,不要把他们吵醒,否则他们将来就不会需要另一个价格昂贵的系统了。