最近我学会了索引的奇迹,并且性能得到了显着提升。然而,凭借我所学到的一切,我似乎找不到这个问题的答案。
索引很棒,但是为什么有人只能将所有字段编入索引以使表格速度极快?我敢肯定有一个很好的理由不这样做,但三十字段表中的三个字段怎么样? 30场比赛中10场比赛?人们应该在哪里画线,为什么?
答案 0 :(得分:99)
索引占用内存空间(RAM);索引太多或太大,数据库必须将它们交换到磁盘或从磁盘交换。它们还会增加插入和删除时间(必须为插入/删除/更新的每个数据更新每个索引)。
你没有无限的记忆。这样所有索引都适合RAM =好。
你没有无限的时间。仅索引需要索引的列可以最小化插入/删除/更新性能命中。
答案 1 :(得分:20)
请记住,每次更新,插入或删除行时都必须更新每个索引。因此,您拥有的索引越多,写入操作的性能就越慢。
此外,每个索引占用更多的磁盘空间和内存空间(调用时),因此它也可能会减慢读取操作(对于大型表)。 Check this out
答案 2 :(得分:9)
您必须平衡CRUD需求。写入表格变慢。至于绘制线的位置,这取决于数据的获取方式(排序过滤等)。
答案 3 :(得分:1)
索引将占用驱动器和内存的更多分配空间,但也会大大提高性能。不幸的是,当它达到内存限制时,系统将放弃驱动器空间并冒险性能。实际上,您不应该索引任何您认为不涉及任何类型的数据遍历算法的字段,既不插入也不搜索(WHERE子句)。但是你应该这样做。默认情况下,您必须索引所有字段。您应该考虑取消索引的字段是查询是否仅由主持人使用,除非他们也需要速度
答案 4 :(得分:0)
索引表中的所有列不是一个好主意。虽然这会使表格读取速度非常快,但写入速度也会慢得多。写入包含索引的每个列的表将涉及将新记录放在该表中,然后将每个列的信息放在其自己的索引表中。
答案 5 :(得分:0)
这个答案是基于我的个人观点,我使用数学逻辑来回答
第二个问题是关于边界的停靠点,首先让我们做一些数学计算,假设我们在一个表中有N行,其中包含L个字段,如果我们为所有字段建立索引,我们将获得一个L个新的索引表,其中每个表将以有意义的方式对索引字段的数据进行排序,乍一看,如果您的表是W权重,那么如果您有100个大表(我已经在项目中工作过,那么它将变成W * 2(1 tera将变成2 tera))表号是大约1800表),您将浪费100倍的空间(100 tera),这远非明智之举。
如果我们要在所有表中应用索引,我们将不得不考虑索引更新是一次更新触发所有索引更新,这是时间上所有无序的选择
据此,我得出结论,在这种情况下,如果您放宽此时间,则最好在选择或更新中丢失它,因为如果您选择未索引的字段,则不会触发所有选择没有索引的字段
要编制什么索引?
主键:我不确定是否有人读过这可以帮助解决这种情况
其他字段:第一个自然答案是剩余污点的一半为什么:如果您应该编制更多索引,则离最佳答案的距离不远如果您应编制更少索引,您的距离也不远,因为我们知道没有索引不好而且所有索引也都不好。
从这三点可以得出结论,如果我们有L个由K个键组成的字段,则限制应该大约在((L-K)/2)+K
左右,或者L / 10。
此答案基于我的逻辑和个人习惯