为什么数据库不会根据查询频率自动索引表?是否存在任何工具可以分析数据库和收到的查询,自动创建或至少建议创建哪些索引?
我特别关注MySQL,但也对其他数据库感兴趣。
这是我在stackoverflow上看过的最好的问题。不幸的是我没有答案。Google的BigTable可以自动索引正确的列,但BigTable不允许任意连接,因此问题空间要小得多。
我唯一能给出的答案是:
有一天有人问:“为什么计算机不能分析我的代码并编译并静态类型化运行最频繁的代码片段?” 今天人们正在解决这个问题(例如FF3.1中的Tamarin),我认为“自动索引”关系型数据库是同类问题,但它不是那么重要。 十年后,手动向数据库添加索引将被视为浪费时间。目前,我们只能监视慢查询并运行优化器。
有一些数据库优化器可以启用或绑定到数据库上,以建议(在某些情况下执行)可能有助于提高性能的索引。
然而,这实际上并不是一个微不足道的问题,当这些辅助工具第一次出现时,用户有时会发现由于较差的优化而导致数据库速度变慢。
最后,数据库架构师在行业中赚了很多钱,他们更喜欢保持现状。
尽管如此,数据库也变得更加智能化。如果你使用Microsoft SQL Server的SQL服务器分析器,你会找到加速服务器的方法。其他数据库也有类似的分析器,还有第三方工具可以完成这项工作。
但如果你是编写查询语句的人,希望你知道足够的关于自己在做什么,以索引正确的字段。否则,拥有正确的索引可能是你面临的最小问题...
-Adam
MS SQL 2005还会根据使用数据维护一个内部参考建议索引的列表。虽然不如Tuning Advisor完整和准确,但是它是自动的。请查阅dm_db_missing_index_groups以获取更多信息。
我认为在一个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中的Infobright引擎不支持“传统”的索引,而是隐式地对所有内容进行索引——它是一种基于列的存储引擎。
这种引擎的行为往往与开发人员(是的,你需要成为一名开发人员才能考虑使用Infobright;它不是标准引擎的插件替换)所期望的非常不同。
有一些工具可以帮助解决这个问题。
对于MS SQL,使用SQL Profiler(记录与数据库的活动)和Database Engine Tuning Advisor(SQL 2005)或Index Tuning Wizard(SQL 2000)来分析活动并推荐索引或其他改进。
http://aws.amazon.com/simpledb/
它还有其他限制:10GB的限制比许多人想象的要大,因此,如果您计划在某个简单的网站上使用它,并且如果它变得很受欢迎,您可以重写它。
遗憾的是,这种自动索引并没有进入DynamoDb中,它似乎已经取代了SimpleDb-他们甚至不再在产品列表中提到SimpleDb,您必须通过旧链接找到它。
我同意Adam Davis在他的评论中所说的。我想补充一点,如果存在这样一种机制可以自动创建索引,那么对于这个功能最常见的反应将是:“很好...我怎么关闭它?”
部分原因可能是索引不仅仅提高了一点速度。如果在大型表中没有适当的索引,查询可能会变得非常缓慢,应用程序可能完全无法使用,而且如果它正在与其他软件交互,可能根本无法工作。因此,在开始尝试使用应用程序之前,确实需要正确地设置索引。
此外,与其在后台构建索引并进一步降低速度,不如在开始添加大量数据之前定义好索引。
我相信我们将会得到更多的工具,这些工具可以获取示例查询并确定需要哪些索引;同样,我们最终可能会得到一些数据库,按照您的建议监视性能并添加它们认为必要的索引,但我认为它们不能取代正确设置索引的重要性。