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

Vae*_*tus 95 mysql sql indexing

最近我学会了索引的奇迹,并且性能得到了显着提升.然而,凭借我所学到的一切,我似乎无法找到这个问题的答案.

索引很棒,但为什么有人只能将所有字段编入索引以使表格速度极快?我敢肯定有一个很好的理由不这样做,但三十字段表中的三个字段怎么样?30场比赛中10场比赛?人们应该在哪里画线,为什么?

Bri*_*ach 110

索引占用内存空间(RAM); 索引太多或太大,数据库必须将它们交换到磁盘或从磁盘交换.它们还会增加插入和删除时间(必须为插入/删除/更新的每个数据更新每个索引).

你没有无限的记忆.这样所有索引都适合RAM =好.

你没有无限的时间.仅索引需要索引的列可以最小化插入/删除/更新性能命中.

  • 很好的随意答案,以提供一般性的理解,但实际上确定在索引上绘制线的位置没有多大帮助.你怎么知道的?只需将它们添加到常见的WHERED字段中并希望获得最佳效果? (11认同)
  • @Sinjai 将它们添加到常用的列中可能是一个很好的经验法则。但事实证明,如果您想成为指数专家,您可以进行大量阅读。例如。/sf/ask/213449841/ (3认同)
  • @Andrew 一年半后,你找到问题的答案了吗? (2认同)
  • 不要忘记磁盘空间。 (2认同)

小智 23

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

此外,每个索引占用更多的磁盘空间和内存空间(调用时),因此它也可能会减慢读取操作(对于大型表). 看一下这个

  • 该链接适用于*MS SQL Server*; 这个问题适用于**MySQL** (6认同)
  • @OMG链接中的大多数要点适用于所有主要的RDBMS (5认同)
  • @Richard aka cyberkiwi:ANSI没有涵盖索引 - 这是每个供应商使用类似术语的奇迹.但即使这样,只有SQL Server和MySQL使用术语"集群"和"非集群"索引 - 它在SQL Server中比MySQL更多.没有什么可以保证一个供应商的建议应该适用于另一个供应商. (4认同)
  • @omg前6点适用于任何dbms.跳过非/聚集的,然后下面是关于一般索引的更多点,也是关于点.如果您想指出具体的事情,请打电话给他们.否则,您似乎在否定评论中的所有答案(包括您删除的答案),没有人同意您的评估. (2认同)

Sma*_*oli 9

您必须平衡CRUD需求.写入表格变慢.至于绘制线的位置,这取决于数据的获取方式(排​​序过滤等).

  • 丰富的资源不是浪费或低效的理由. (9认同)
  • 没错,但限制不是10多年前的限制. (5认同)
  • Brian指出@OMG但不是RAM.从来没有**存储超过你需要的好主意.RAM中的数据/索引缓存,备份媒体(适合每个磁带的版本等)都受无用索引的影响 (3认同)