有哪些数据库支持自动索引创建?

27

为什么数据库不会根据查询频率自动索引表?是否存在任何工具可以分析数据库和收到的查询,自动创建或至少建议创建哪些索引?

我特别关注MySQL,但也对其他数据库感兴趣。

11个回答

14

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

我唯一能给出的答案是:

有一天有人问:“为什么计算机不能分析我的代码并编译并静态类型化运行最频繁的代码片段?” 今天人们正在解决这个问题(例如FF3.1中的Tamarin),我认为“自动索引”关系型数据库是同类问题,但它不是那么重要。 十年后,手动向数据库添加索引将被视为浪费时间。目前,我们只能监视慢查询并运行优化器。


1
如果有一个正确的答案,数据库早就做出来了。总是存在权衡。你可以拥有数百个索引,查询总是运行得很快,但插入和更新会变慢。哪个更好?因为你的查询经常运行并不意味着它对你来说是最重要的工作。 - Mark Brady
@Mark Brady:说得对,这总是一个权衡。 - Mitch Wheat
这篇回答是在2008年写的...现在已经快到2018年了,我们仍然停留在那个时候...手动添加索引并搜索谷歌以查看这个领域是否有任何进展。疯狂吧? - degenerate
@degenerate 现在已经过去十年了...也许值得更新答案,说成“二十年”或列出当前的可能性(没有?)。 - beppe9000
有几个需求,都是可以实现的:一个功能是创建针对读取进行优化的索引,另一个是创建针对写入进行优化的索引,第三个则是上述两者的某种组合。优化器会分析数据,运行应用程序的查询并对其进行基准测试,按照预测的行数进行扩展等。 - Will Sheppard

10

有一些数据库优化器可以启用或绑定到数据库上,以建议(在某些情况下执行)可能有助于提高性能的索引。

然而,这实际上并不是一个微不足道的问题,当这些辅助工具第一次出现时,用户有时会发现由于较差的优化而导致数据库速度变慢。

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

尽管如此,数据库也变得更加智能化。如果你使用Microsoft SQL Server的SQL服务器分析器,你会找到加速服务器的方法。其他数据库也有类似的分析器,还有第三方工具可以完成这项工作。

但如果你是编写查询语句的人,希望你知道足够的关于自己在做什么,以索引正确的字段。否则,拥有正确的索引可能是你面临的最小问题...

-Adam


12
这个说法太愚蠢了,“数据库架构师更喜欢现状”。我们可不是一个庞大的卡特尔,将每一个自索引数据库的尝试都扼杀在摇篮之中。就像油公司遮掩那个能让你的车以100英里每加仑行驶的简单装置一样。 - Mark Brady
4
@Adam Davis:“但如果您正在编写查询,希望您了解足够的知识去索引正确的字段。如果不是这样,那么拥有正确的索引可能是您问题中最小的一部分。”——没有正确的索引描述了大部分数据库存在的情况... - Mitch Wheat
1
这里的简单SQL脚本可以转储SQL Server自身的内部指标,包括索引列表和创建它们的预估收益 - 适用于2005、2008和2012版本:http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx - Chris Moschini

4

MS SQL 2005还会根据使用数据维护一个内部参考建议索引的列表。虽然不如Tuning Advisor完整和准确,但是它是自动的。请查阅dm_db_missing_index_groups以获取更多信息。


3

2

是的,一些数据库引擎支持自动索引。例如mysql中的Infobright引擎不支持“传统”的索引,而是隐式地对所有内容进行索引——它是一种基于列的存储引擎。

这种引擎的行为往往与开发人员(是的,你需要成为一名开发人员才能考虑使用Infobright;它不是标准引擎的插件替换)所期望的非常不同。


2

有一些工具可以帮助解决这个问题。

对于MS SQL,使用SQL Profiler(记录与数据库的活动)和Database Engine Tuning Advisor(SQL 2005)或Index Tuning Wizard(SQL 2000)来分析活动并推荐索引或其他改进。


1
亚马逊的SimpleDB根据您的使用情况,在所有列上自动进行索引:

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

它还有其他限制:
  • 它是一个键值存储,而不是RDB。显然,这意味着缓慢的连接(和没有内置的连接支持)。
  • 它对表大小有10GB的限制。有一些库可以为您处理大数据分区,尽管这会将您锁定在该库的操作方式中,这可能会带来自己的问题。
  • 它将所有值都存储为字符串,即使是数字,这会导致按列排序时出现1、9和10的情况,就像1、10、9一样,除非您使用一个通过0填充来解决此问题的库。这也会影响负数。

10GB的限制比许多人想象的要大,因此,如果您计划在某个简单的网站上使用它,并且如果它变得很受欢迎,您可以重写它。

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


1

看起来MySQL没有一个用户友好的分析器。也许你想尝试一些像this这样的东西,它是基于MySQL分析器的php类。


1

我同意Adam Davis在他的评论中所说的。我想补充一点,如果存在这样一种机制可以自动创建索引,那么对于这个功能最常见的反应将是:“很好...我怎么关闭它?”


1

部分原因可能是索引不仅仅提高了一点速度。如果在大型表中没有适当的索引,查询可能会变得非常缓慢,应用程序可能完全无法使用,而且如果它正在与其他软件交互,可能根本无法工作。因此,在开始尝试使用应用程序之前,确实需要正确地设置索引。

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

我相信我们将会得到更多的工具,这些工具可以获取示例查询并确定需要哪些索引;同样,我们最终可能会得到一些数据库,按照您的建议监视性能并添加它们认为必要的索引,但我认为它们不能取代正确设置索引的重要性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接