提问人:jcnnghm 提问时间:10/24/2008 最后编辑:Eddiejcnnghm 更新时间:2/14/2013 访问量:9120
是否有任何数据库支持自动创建索引?
Do any databases support automatic Index Creation?
问:
为什么数据库不根据查询频率自动索引表?是否有任何工具可以分析数据库及其接收的查询,并自动创建,或者至少建议要创建的索引?
我对MySQL特别感兴趣,但我也会对其他数据库感到好奇。
答:
有一些工具可以做到这一点。
对于 MS SQL,请使用 SQL 事件探查器(针对数据库记录活动)和数据库引擎优化顾问 (SQL 2005) 或索引优化向导 (SQL 2000) 来分析活动并推荐索引或其他改进。
Google App Engine 就是这样做的(参见 index.yaml 文件)。
有一些数据库优化器可以启用或附加到数据库,以建议(在某些情况下执行)可能有帮助的索引。
然而,这实际上并不是一个微不足道的问题,当这些辅助工具首次出现时,用户有时会发现,由于优化效果不佳,它实际上减慢了他们的数据库速度。
最后,对于数据库架构师来说,这个行业有很多钱,他们更喜欢现状。
尽管如此,数据库正变得越来越智能。如果将 SQL Server 探查器与 Microsoft SQL Server 一起使用,您将找到加快服务器速度的方法。其他数据库具有类似的探查器,并且有第三方实用程序可以完成这项工作。
但是,如果您是编写查询的人,希望您足够了解您正在做什么来索引正确的字段。如果没有,那么拥有正确的索引可能是您最少的问题......
-亚当
评论
MS SQL 2005 还维护了基于使用数据创建的建议索引的内部引用。它不像 Tuning Advisor 那样完整或准确,但它是自动的。研究dm_db_missing_index_groups了解更多信息。
我同意亚当·戴维斯(Adam Davis)在他的评论中所说的话。我要补充一点,如果存在这样的机制来自动创建索引,那么对此功能最常见的反应是,“这很好......我该如何关闭它?
这是我在stackoverflow上看到的最好的问题。不幸的是,我没有答案。Google 的 bigtable 确实会自动索引正确的列,但 BigTable 不允许任意连接,因此问题空间要小得多。
我唯一能给出的答案是:
有一天,有人问:“为什么计算机不能分析我的代码,然后编译和静态键入最常运行的代码片段?”
今天人们正在解决这个问题(例如FF3.1中的Tamarin),我认为“自动索引”关系数据库是同一类问题,但它并不是一个优先事项。十年后,手动向数据库添加索引将被视为浪费时间。目前,我们只能监控慢速查询和运行优化器。
评论
部分原因可能是指数不只是提供小幅加速。如果对大型表没有合适的索引,则查询的运行速度会非常慢,以至于应用程序完全无法使用,并且如果它与其他软件交互,它可能根本无法工作。因此,在开始尝试使用应用程序之前,您确实需要索引正确。
此外,与其在后台构建索引,并在构建索引时进一步减慢速度,不如在开始添加大量数据之前定义索引。
我相信我们会得到更多的工具,这些工具可以进行示例查询并确定哪些索引是必要的;此外,我们最终可能会得到按照您的建议执行的数据库,并监控性能并添加他们认为必要的索引,但我认为它们不会取代从正确的索引开始。
我认为 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 +
似乎MySQL没有用户友好的分析器。也许你想尝试这样的东西,一个基于MySQL分析器的php类。
是的,某些引擎确实支持自动索引。mysql 的一个例子是 Infobright,他们的引擎不支持“传统”索引,而是隐式索引所有内容 - 这是一个基于列的存储引擎。
这种引擎的行为往往与开发人员(是的,你需要成为开发人员才能考虑使用Infobright;它不是标准引擎的插件替代品)所期望的非常不同。
Amazon 的 SimpleDB 根据您的使用情况对所有列进行自动索引:
http://aws.amazon.com/simpledb/
不过,它还有其他限制:
- 它是一个键值存储,而不是 RDB。显然,这意味着连接速度较慢(并且没有内置的连接支持)。
- 它的表大小限制为 10GB。有些库会为你处理大数据的分区,尽管这会把你锁定在该库的做事方式中,这可能会有其自身的问题。
- 它将所有值存储为字符串、偶数,这使得对带有 1、9 和 10 的列进行排序就像 1,10,9 一样,除非您使用一个通过 0 填充来破解它的库。这也会影响负数。
10gb 的限制比许多人想象的要大,因此您可以继续为一个简单的网站执行此操作,如果它达到很大,您计划重写它。
不幸的是,这种自动索引没有进入 DynamoDb,而 DynamoDb 似乎已经取代了它 - 他们甚至不再在他们的产品列表中提到 SimpleDb,您必须通过指向它的旧链接找到它。
In this day ChatGPT does a fairly good job in analyzing your query and joins involved to suggest index candidates. It does not know the internals of your database of course but it does hint where indexes might be set.
Prompt: ChatGPT, please suggest indexes for this query <enter your query here>
than simply ask please generate the DDL statements
and thank ChatGPT: thanks, that was most helpful
评论