26

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

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

4

11 回答 11

13

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

我能给出的唯一答案是:

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

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

于 2008-10-24T02:35:16.760 回答
10

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

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

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

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

但是,如果您是编写查询的人,希望您对索引正确字段的操作有足够的了解。如果没有,那么拥有正确的索引可能是您的问题中最少的......

-亚当

于 2008-10-23T21:12:24.010 回答
4

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

于 2008-10-23T21:14:51.010 回答
3

我认为一个 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 +

于 2009-01-20T13:21:17.660 回答
2

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

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

于 2008-10-23T21:09:08.883 回答
2

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

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

于 2009-11-25T18:44:07.330 回答
1

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

于 2008-10-23T21:21:13.773 回答
1

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

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

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

于 2008-10-24T15:02:25.180 回答
1

似乎 MySQL 没有用户友好的分析器。也许你想尝试这样的东西一个基于 MySQL profiler 的 php 类。

于 2009-08-21T09:12:41.317 回答
1

Amazon 的 SimpleDB 会根据您的使用情况对所有列进行自动索引:

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

但它还有其他限制:

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

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

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

于 2013-02-14T00:06:27.827 回答
0

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

于 2008-10-23T21:09:24.187 回答