【问题标题】:Do any databases support automatic Index Creation?是否有任何数据库支持自动索引创建?
【发布时间】:2010-09-18 21:26:41
【问题描述】:

为什么数据库不根据查询频率自动索引表?是否存在任何工具来分析数据库及其接收的查询,并自动创建或至少建议创建哪些索引?

我对 MySQL 特别感兴趣,但我也对其他数据库感到好奇。

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

    这是我在 stackoverflow 上看到的最好的问题。不幸的是,我没有答案。 Google 的 bigtable 会自动索引正确的列,但 BigTable 不允许任意连接,因此问题空间要小得多。

    我能给出的唯一答案是:

    有一天有人问:“为什么计算机不能只分析我的代码并编译和静态键入最常运行的代码片段?”

    今天人们正在解决这个问题(例如 FF3.1 中的 Tamarin),我认为“自动索引”关系数据库是同一类问题,但不是优先考虑的问题。十年后,手动向数据库添加索引将被认为是浪费时间。目前,我们只能监控慢查询和运行优化器。

    【讨论】:

    • 如果有一个正确的答案,数据库就会这样做。总会有取舍。您可能有 100 多个索引,查询总是运行得很快,但插入和更新会拖累。哪个更好?因为您的查询经常运行并不意味着它对您来说是最重要的工作。
    • @Mark Brady:看准:这总是一种权衡。
    • 这个答案是在 2008 年写的……快 2018 年了,我们仍然在那个时候……添加手动索引并搜索谷歌,看看这个空间是否有任何动静。疯了吧?
    • @degenerate 现在已经十多年了......可能值得更新答案,说“二十年”或列出当前的可能性(没有?)。
    【解决方案2】:

    有一些数据库优化器可以启用或附加到数据库以建议(并在某些情况下执行)可能有助于解决问题的索引。

    然而,这实际上并不是一个微不足道的问题,当这些辅助工具首次出现时,用户有时会发现由于优化不佳,它实际上会减慢他们的数据库速度。

    最后,数据库架构师在行业中有很多钱,他们更喜欢现状。

    不过,数据库正变得越来越智能。如果您将 SQL Server Profiler 与 Microsoft SQL Server 一起使用,您将找到加快服务器速度的方法。其他数据库也有类似的分析器,并且有第三方实用程序可以完成这项工作。

    但是,如果您是编写查询的人,希望您足够了解您正在做什么来索引正确的字段。如果没有,那么拥有正确的索引可能是您遇到的最少问题...

    -亚当

    【讨论】:

    • 多么愚蠢的说法,“数据库架构师更喜欢现状”。是的,我们是一个大型卡特尔,它压制了使数据库自索引的每一次尝试。就像您添加到汽车中以获得 100mpg 的简单设备一样,石油公司对我们隐瞒。
    • @Adam Davis:“但是,如果您是编写查询的人,希望您对自己正在做的事情有足够的了解来索引正确的字段。如果没有,那么拥有正确的索引很可能是最少的问题” - 没有正确的索引描述了所有数据库的很大一部分......
    • 这里的简单 SQL 脚本将 SQL Server 自己的内部指标与索引列表以及创建它们的估计收益一起转储 - 适用于 2005、2008 和 2012 年:blogs.msdn.com/b/bartd/archive/2007/07/19/…
    【解决方案3】:

    MS SQL 2005 还维护建议索引的内部引用,以根据使用数据创建。它不像 Tuning Advisor 那样完整或准确,但它是自动的。研究 dm_db_missing_index_groups 以获取更多信息。

    【讨论】:

      【解决方案4】:

      我认为一个 MS SQL 博客上有一个脚本,其中有一个用于在 SQL 2005 中建议索引的脚本,但我现在找不到确切的脚本!我记得它只是描述中的东西。这是指向更多信息的链接http://blogs.msdn.com/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx

      PS 仅适用于 SQL Server 2005 +

      【讨论】:

        【解决方案5】:

        有一些工具可以做到这一点。

        对于 MS SQL,使用 SQL Profiler(记录数据库活动)和数据库引擎优化顾问 (SQL 2005) 或索引优化向导 (SQL 2000) 分析活动并推荐索引或其他改进。

        【讨论】:

          【解决方案6】:

          是的,某些引擎确实支持自动索引。 mysql 的一个例子是 Infobright,他们的引擎不支持“常规”索引,而是隐式索引所有内容 - 这是一个基于列的存储引擎。

          此类引擎的行为往往与开发人员所期望的非常不同(是的,您甚至不需要成为开发人员就可以考虑使用 Infobright;它不是标准引擎的插件替代品)。

          【讨论】:

            【解决方案7】:

            我同意亚当戴维斯在评论中所说的话。我要补充一点,如果存在这种自动创建索引的机制,那么对此功能最常见的反应是,“太好了……我该如何关闭它?”

            【讨论】:

              【解决方案8】:

              部分原因可能是索引不只是提供小的加速。如果您在大型表上没有合适的索引,则查询运行速度可能会非常慢,以至于应用程序完全无法使用,并且如果它正在与其他软件交互,它可能根本无法工作。因此,在开始尝试使用应用程序之前,您确实需要正确的索引。

              此外,与其在后台构建索引并在构建过程中进一步减慢速度,不如在开始添加大量数据之前定义索引。

              我相信我们会得到更多的工具来获取样本查询并计算出哪些索引是必要的;也可能我们最终会获得按照您的建议执行并监控性能并添加他们认为必要的索引的数据库,但我认为它们不会替代从正确的索引开始。

              【讨论】:

                【解决方案9】:

                似乎 MySQL 没有用户友好的分析器。也许你想试试this,一个基于 MySQL profiler 的 php 类。

                【讨论】:

                  【解决方案10】:

                  Amazon 的 SimpleDB 会根据您的使用情况自动为所有列建立索引:

                  http://aws.amazon.com/simpledb/

                  但它还有其他限制:

                  • 它是键值对存储,而不是 RDB。显然,这意味着慢速连接(并且没有内置的连接支持)。
                  • 它的表大小限制为 10gb。有一些库会为您处理大数据分区,尽管这会将您锁定在该库的做事方式中,这可能有其自身的问题。
                  • 它将所有值存储为字符串,偶数,这使得使用 1,9 和 10 对列进行排序后会像 1,10,9 一样出现,除非您使用通过 0 填充来破解它的库。这也会影响负数。

                  10gb 的限制比许多人想象的要大,所以你可以继续这个简单的网站,如果它变大了,你计划重写。

                  不幸的是,这种自动索引并没有进入 DynamoDb,它似乎已经取代了它——他们甚至不再在他们的产品列表中提到 SimpleDb,你必须通过旧链接找到它。

                  【讨论】:

                    【解决方案11】:

                    Google App Engine 会这样做(请参阅 index.yaml 文件)。

                    【讨论】:

                      猜你喜欢
                      • 2018-05-17
                      • 1970-01-01
                      • 2013-04-12
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-09-09
                      • 2016-01-05
                      • 1970-01-01
                      相关资源
                      最近更新 更多