最近,我了解了索引的奇妙之处,并且性能得到了极大的提高。但是,据我所知,我似乎找不到该问题的答案。
索引很棒,但是为什么有人不能只索引所有字段以使表变得如此快呢?我确定有充分的理由不这样做,但是三十字段表中的三个字段又如何呢?30个字段中有10个?一个人应该划界线,为什么呢?
最近,我了解了索引的奇妙之处,并且性能得到了极大的提高。但是,据我所知,我似乎找不到该问题的答案。
索引很棒,但是为什么有人不能只索引所有字段以使表变得如此快呢?我确定有充分的理由不这样做,但是三十字段表中的三个字段又如何呢?30个字段中有10个?一个人应该划界线,为什么呢?
Answers:
索引占用内存(RAM)中的空间;索引太多或太大,数据库将不得不在磁盘之间来回交换它们。它们还会增加插入和删除时间(必须为每个插入/删除/更新的数据更新每个索引)。
您没有无限的记忆。使所有索引都适合RAM =好。
您没有无限的时间。仅对需要索引的列建立索引可最大程度地减少插入/删除/更新性能的影响。
请记住,每当更新,插入或删除行时,都必须更新每个索引。因此,拥有的索引越多,写入操作的性能就会越慢。
同样,每个索引占用更多的磁盘空间和内存空间(在调用时),因此它也可能会减慢读取操作(对于大型表)。 看一下这个
您必须平衡CRUD的需求。写入表变慢。至于在哪里画线,这取决于如何访问数据(排序过滤等)。
这个答案是基于我的个人观点,我正在使用我的数学逻辑来回答
第二个问题是关于边界的停靠点,首先进行一些数学计算,假设我们在一个表中有N行,其中L个字段,如果我们对所有字段建立索引,我们将获得L个新的索引表,其中每个表都将按有意义的是索引字段的数据,乍看之下,如果您的表是W权重,那么如果您有100个大表(我已经在项目表号为arround 1800 table),您将浪费100倍的空间(100 tera),这与明智之举相去甚远。
如果要在所有表中应用索引,我们将不得不考虑索引更新是一次更新触发所有索引更新,这是时间上所有无序选择的等效项
由此我得出的结论是,在这种情况下,如果您要放宽此时间,则最好在选择或更新中丢失它,因为如果您选择未索引的字段,则不会在所有没有索引
索引什么?
外键:必须基于
primary-key:我尚不确定这是否有人阅读此书可以解决这种情况
其他字段:第一个自然答案是剩余污点的一半为什么:如果您应该编制更多索引,您应该离最佳答案不远;如果您应编制更少索引,您也不会相距遥远,因为我们知道没有索引是不好的,并且所有索引都已编制也是不好的
从这三点可以得出结论,如果我们有由K个键组成的L个字段,则限制应该在((L-K)/2)+K
L / 10左右
这个答案是基于我的逻辑和个人习惯
索引表中的所有列不是一个好主意。虽然这将使表的读取速度非常快,但写入速度也变慢了很多。写入对每个列都建立索引的表将涉及将新记录放入该表中,然后将每个列的信息放入其自己的索引表中。