【问题标题】:Is there a downside to adding numerous indexes to tables?向表中添加大量索引是否有缺点?
【发布时间】:2011-01-12 18:07:39
【问题描述】:

我正在创建一个新数据库,并且想知道向我认为可能需要一个的表添加大量索引是否有任何不利之处。

如果我创建了一个索引但最终没有使用它会不会导致任何问题?

【问题讨论】:

  • 我从未见过在不到一分钟的时间内有这么多重复答案的问题。
  • 我认为随着 SO 越来越流行,这种情况越来越可能发生,尤其是在像这样的简单/通用问题上。
  • 是的,我同意。我只是没想到输入一个快速答案,发布它,然后看到 10 个确切(或多或少)同时发布的答案。

标签: sql database indexing


【解决方案1】:

索引使搜索表更快,但写入时间更长。拥有未使用的索引将导致一些不必要的减速。

【讨论】:

  • 而且索引也会占用磁盘空间。
【解决方案2】:

每个索引:

  • 在磁盘和 RAM 中占据某个位置
  • 每次插入/更新/删除一行都需要一些时间来更新

这意味着您应该只定义对您的应用程序的需求有用的索引:过多的索引会减慢写入速度,而不是您从读取中获得的收益。

【讨论】:

    【解决方案3】:

    是的。 您应该只添加那些必要的索引。

    索引需要额外的空间,并且在插入/更新/删除记录时,DBMS 也需要更新这些索引。因此,这意味着更新/添加/删除记录需要更多时间,因为 DBMS 必须进行一些额外的管理。

    向表中添加大量索引 我认为可能需要一个。

    您应该只添加那些您确定它们是必要的索引。 要确定可以放置索引的列,您可以:

    • 为以下列添加索引 外键
    • 为 where 子句中经常使用的列添加索引
    • 为按子句顺序使用的列添加索引。

    另一种可能更好的方法是使用 SQL Profiler:

    • 使用 SQL Profiler 跟踪您的 一段时间的应用程序/数据库
    • 保存跟踪结果
    • 使用索引调整向导中的跟踪结果,它会告诉您应该创建哪些索引、每个索引中应该包含哪些列,并且还会告诉您索引中这些列的顺序。

    【讨论】:

      【解决方案4】:

      索引会导致数据库大小和插入/更新/删除记录的时间增加。除非您知道自己会使用它们,否则尽量不要添加它们。

      【讨论】:

        【解决方案5】:

        拥有索引意味着 INSERT 和 UPDATE 需要更长的时间。如果您有太多索引,那么更快的搜索时间所带来的好处可能变得不值得额外的 INSERT 和 UPDATE 时间。

        【讨论】:

          【解决方案6】:

          是的;拥有索引会使选择更快,但可能会使插入速度变慢,因为必须为每次插入更新索引。如果您的应用程序进行大量写入而不是大量读取(例如审核日志),您应该避免额外的索引。

          【讨论】:

            【解决方案7】:
            • 更新和插入成本更高,因为索引也需要更新
            • 使用更多空间

            【讨论】:

              【解决方案8】:

              不要在开始时创建任何额外的索引。等到您至少部分开发了系统,这样您就可以对表格的使用有所了解。生成查询计划以查看查询的内容(以及查询方式和性能成本),然后根据需要添加新索引。

              【讨论】:

                【解决方案9】:

                不要盲目索引!查看您的数据,了解 SELECT 谓词中实际使用了哪些列并为这些列编制索引。

                还要考虑索引占用空间。有时空间很大。我见过的数据库中,索引数据的数量远远超过了原始数据。

                【讨论】:

                  【解决方案10】:

                  如大家所说,额外的空间,额外的插入时间。

                  此外,您应该确定您的索引和您的设计,因为如果查询优化器选择了错误的索引,有时索引实际上会减慢查询速度。这并不常见,但如果通过优化特定连接的索引并导致另一个连接实际上变慢,就会发生这种情况。我不了解 SQL Server,但您会发现很多技巧可以提示 mySQL 优化器以特定方式构建查询来解决这个问题。

                  DBA 会花很多钱来了解像这样带有索引的奇怪陷阱(除其他外),所以是的,添加大量索引也有缺点,所以要小心。高度依赖您的查询分析器,不要盲目地使用索引来解决问题。

                  【讨论】:

                    【解决方案11】:

                    查看 where 子句中使用的列,查看连接中使用的列(如果有)。 通常是最简单的经验法则。 如前所述,无关索引会减慢您的 DML 语句,通常不推荐使用。理想情况下,我所做的是完成整个模块,在单元测试阶段,确保您可以对模块进行负载分析,然后检查您是否看到减速,并在分析减速的位置后,添加索引.

                    【讨论】:

                      【解决方案12】:

                      我认为它已经得到了回答,但基本上索引会减慢插入/更新速度,因为在插入新记录(或更新现有记录)时会更新索引。

                      空间也是一个考虑因素,包括内存和磁盘。

                      因此,对于发生大量事务的数据库,这肯定会对性能产生显着影响(这就是为什么性能调整包括添加和删除索引以优化针对数据库执行的某些活动的原因)。

                      祝你好运

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-09-17
                        • 1970-01-01
                        • 2011-05-25
                        • 2017-03-22
                        • 1970-01-01
                        相关资源
                        最近更新 更多