【问题标题】:Why don't databases intelligently create the indexes they need?为什么数据库不能智能地创建它们需要的索引?
【发布时间】:2009-11-16 07:18:00
【问题描述】:

我刚刚听说您应该在要加入或查询的任何列上创建索引。如果条件就这么简单,为什么数据库不能自动创建自己需要的索引呢?

【问题讨论】:

  • 因为一般来说,没那么简单!
  • 与大多数事情一样,需要权衡取舍。

标签: database indexing


【解决方案1】:

嗯,他们有;至少在某种程度上……

例如,参见SQL Server Database Engine Tuning Advisor

但是,创建最佳索引并不像您提到的那么简单。一个更简单的规则可能是在每一列上创建索引(这远非最佳)!

索引不是免费的。您以存储和更新性能等为代价创建索引。应该仔细考虑它们是最优的。

【讨论】:

    【解决方案2】:

    您添加的每个索引可能会提高您的查询速度。它降低更新、插入和删除的速度,并且增加磁盘空间使用率。

    一方面,我宁愿将控制权留给自己,使用 DB Visualizer 和解释语句等工具来提供我需要的信息来评估应该做什么。我确实希望 DBMS 单方面决定什么是最好的。

    在我看来,由一个真正智能的实体来做出关于数据库调整的决策要好得多。 DBMS 可以提出所有建议,但最终决定权应留给 DBA。

    当数据库使用模式改变一周后会发生什么?您真的希望 DBMS 创建索引并在一周后销毁它们吗?这听起来像是天网旁边的管理噩梦:-)

    【讨论】:

      【解决方案3】:

      这是个好问题。数据库可以根据数据使用模式创建所需的索引,但这意味着数据库在第一次执行某些查询时会很慢,然后随着时间的推移变得更快。例如如果有这样的表:

      用户名 ----------

      :那么用户名将用于经常查找用户。一段时间后,数据库可以看到 50% 的查询都这样做了,在这种情况下,它可以在用户名上添加索引。

      然而,之所以没有详细实施,只是因为它不是一个杀手级功能。 DBA 执行添加索引的次数相对较少,并且通过自动化(这是一项非常大的任务)对于数据库供应商来说可能不值得。请记住,必须分析每个查询以启用自动索引,以及查询响应时间和结果集大小,因此实现起来并非易事。

      【讨论】:

        【解决方案4】:

        因为数据库只是存储和检索数据 - 数据库引擎不知道您打算如何检索该数据,直到您实际执行它,在这种情况下创建索引为时已晚。而且您要加入的列可能不适合高效索引。

        【讨论】:

        • 为什么为时已晚?我假设你永远不会只在这个数据库上运行一个查询。它可能会监视模式并相应地更新自己。当然,这意味着数据库必须假设您将继续以这种方式使用它,但这是可行的。
        • 这不一定是真的。 RDMS 知道字段的类型及其约束,因此它能够根据需要创建新的索引。虽然这是可能的,但它不适合可扩展性,因为 RDBMS 必须在创建新索引之前对现有索引进行广泛分析,以避免碎片和其他问题。
        【解决方案5】:

        这是一个需要解决的重要问题,在许多情况下,次优的自动解决方案实际上可能会使事情变得更糟。想象一个数据库,它的读取操作通过自动创建索引而加速,但由于管理索引的开销,它的插入和更新被淹没了?这是好是坏取决于您的数据库的性质和它所服务的应用程序。

        如果有一个万能的解决方案,数据库肯定已经这样做了(并且有工具可以准确地建议这种优化)。但调整数据库性能在很大程度上是一个特定于应用程序的功能,最好手动完成,至少目前是这样。

        【讨论】:

          【解决方案6】:

          RDBMS 可以轻松地自行调整并根据需要创建索引,但这仅适用于查询没有严格执行计划的简单情况。大多数索引都是为了特定目的而创建的,并且这些类型的优化最好手动处理。

          【讨论】:

          • 磁盘空间使用量也有可能达到顶峰,如果人们在索引事物时仍然关心的话。
          猜你喜欢
          • 2019-12-17
          • 1970-01-01
          • 2021-12-01
          • 2016-09-13
          • 2012-05-15
          • 2014-08-27
          • 2020-03-17
          • 2014-06-04
          • 2011-09-19
          相关资源
          最近更新 更多