MySQL - why not index every field?
最近,我了解了索引的神奇之处,性能有了显著的提高。然而,我所学到的一切似乎都找不到这个问题的答案。
索引是很好的,但是为什么不能有人仅仅索引所有的字段,使表变得非常快?我相信有一个很好的理由不这样做,但是在一个30字段的表中有三个字段如何?在30个字段中输入10?应该在哪里画线,为什么?
索引占用内存(RAM)中的空间;索引太多或太大,数据库将不得不在磁盘之间交换索引。它们还增加了插入和删除时间(必须为插入/删除/更新的每一条数据更新每个索引)。
你没有无限的记忆。使所有索引都适合RAM=good。
你没有无限的时间。只对需要索引的列进行索引可以最小化插入/删除/更新性能的影响。
请记住,每次更新、插入或删除行时,都必须更新每个索引。所以索引越多,写操作的性能就越慢。
此外,每个索引占用更多的磁盘空间和内存空间(调用时),因此它也可能降低读取操作的速度(对于大型表)。看看这个
你必须平衡积垢的需要。写表格会变慢。至于画线的位置,这取决于数据的访问方式(排序过滤等)。
索引将占用更多从驱动器和RAM分配的空间,但也会大大提高性能。不幸的是,当它达到内存限制时,系统将放弃驱动器空间并冒性能风险。实际上,您不应该索引任何您认为不涉及任何类型数据遍历算法的字段,既不插入也不搜索(WHERE子句)。但如果不是的话,你应该这样做。默认情况下,您必须索引所有字段。您应该考虑取消索引的字段是,如果查询仅由版主使用,除非它们也需要速度。
这个答案是我个人的观点,我用我的数学逻辑来回答
第二个问题是关于边界在哪里停止,首先让我们做一些数学计算,假设我们在一个表中有n行和l个字段,如果我们对所有字段进行索引,我们将得到一个l个新的索引表,其中每个表都将以有意义的方式对索引字段的数据进行排序,乍一看,如果您的表是w权重,它将变为w*2。(1太拉将变为2太拉)如果你有100个大桌子(我已经在项目中工作过,在1800个桌子上排列了表号),你将浪费100倍的空间(100太拉),这是远远不够明智的。
如果我们将在所有表中应用索引,我们将不得不考虑索引更新是一次更新触发所有索引更新这是一次全选无序等效时间
由此我得出的结论是,在这种情况下,如果您要释放这一时间,最好在select或update中丢失它,因为如果您要选择一个未编入索引的字段,则不会在所有未编入索引的字段上触发另一个select。
索引什么?
外键:必须基于
主键:我还不确定是否有人读过这篇文章可以帮助解决这个问题
其他领域:第一个自然答案是剩下的一半:为什么:如果你应该索引更多,你就离最好的答案不远,如果你应该索引更少,你也不远,因为我们知道没有索引是坏的,所有索引也是坏的。
从这3点我可以得出结论,如果我们有由K键组成的L字段,那么极限应该在靠近
这个答案是基于我的逻辑和个人经验
索引表中的所有列不是一个好主意。虽然这将使表的读取速度非常快,但写入速度也会慢得多。写入一个索引了每个列的表将涉及将新记录放入该表中,然后将每个列的信息放入其自己的索引表中。