为什么数据库不能根据查询频率自动索引表?是否存在任何工具来分析数据库及其正在接收的查询,并自动创建或至少建议要创建哪些索引?
我对MySQL特别感兴趣,但我也对其他数据库感到好奇。
答案 0 :(得分:13)
这是我在stackoverflow上看到的最好的问题。不幸的是我没有答案。 Google的bigtable会自动为正确的列编制索引,但BigTable不允许任意连接,因此问题空间要小得多。
我能给出的唯一答案是:
有一天有人问道,“为什么计算机不能只分析我的代码并编译和静态输入最常运行的代码片段?”人们今天正在解决这个问题(例如,FF3.1中的Tamarin),我认为“自动索引”关系数据库是同一类问题,但它并不是优先考虑的问题。十年后,手动将索引添加到数据库将被视为浪费时间。目前,我们一直在监控慢速查询和运行优化器。
答案 1 :(得分:9)
可以启用或附加到数据库的数据库优化器,以建议(在某些情况下执行)可能有助于解决问题的索引。
然而,这实际上并不是一个微不足道的问题,当这些辅助工具首次出现时,用户有时会发现它实际上由于优化程度较低而放慢了数据库的速度。
最后,数据库架构师在行业中有很多钱,他们更喜欢现状。
然而,数据库变得越来越聪明。如果您将SQL Server Profiler与Microsoft SQL Server一起使用,您将找到加快服务器运行速度的方法。其他数据库有类似的分析器,并且有第三方实用程序来完成这项工作。
但是如果你是编写查询的人,希望你对你正在做的事情有足够的了解来为正确的字段编制索引。如果没有,那么拥有正确的索引可能是你问题最少的......
- 亚当
答案 2 :(得分:4)
MS SQL 2005还维护了基于使用数据创建的建议索引的内部引用。它不像Tuning Advisor那样完整或准确,但它是自动的。研究dm_db_missing_index_groups以获取更多信息。
答案 3 :(得分: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 +
答案 4 :(得分:2)
这里有工具。
对于MS SQL,使用SQL事件探查器(记录针对数据库的活动),以及数据库引擎优化顾问(SQL 2005)或索引优化向导(SQL 2000)来分析活动并推荐索引或其他改进。
答案 5 :(得分:2)
是的,有些引擎支持自动索引。一个这样的mysql示例是Infobright,它们的引擎不支持“常规”索引,而是隐式索引所有内容 - 这是一个基于列的存储引擎。
这些引擎的行为往往与开发人员的行为大不相同(而且,是的,您甚至不需要考虑使用Infobright,而不是标准引擎的插件替代品)。< / p>
答案 6 :(得分:1)
我同意Adam Davis在评论中所说的话。我要补充一点,如果存在这样一种自动创建索引的机制,对这个特性的最常见的反应就是“这很好......我怎么把它关掉?”
答案 7 :(得分:1)
部分原因可能是索引不只是给出一个小的加速。如果在大型表上没有合适的索引,则查询运行速度太慢,以至于应用程序完全无法使用,并且如果它与其他软件交互,则它可能无法正常工作。因此,在开始尝试使用该应用程序之前,您确实需要索引。
此外,不是在后台构建索引,而是在构建索引时进一步降低速度,最好在开始添加大量数据之前定义索引。
我确信我们会获得更多可以进行样本查询并找出所需索引的工具;也许我们最终会得到按照你的建议做的数据库并监控性能并添加他们认为必要的索引,但我认为它们不会替代正确的索引。
答案 8 :(得分:1)
似乎MySQL没有用户友好的探查器。也许你想尝试像this这样的基于MySQL分析器的php类。
答案 9 :(得分:1)
亚马逊的SimpleDB根据您的使用情况对所有列进行自动索引:
http://aws.amazon.com/simpledb/
但它有其他限制:
10gb的限制比许多人想象的要大,所以你可以继续这个,为一个你计划重写的简单网站,如果它有点大的话。
不幸的是,这种自动索引没有进入DynamoDb,它似乎取代了它 - 他们甚至不再在他们的产品列表中提到SimpleDb,你必须通过它的旧链接找到它。 / p>
答案 10 :(得分:0)
Google App Engine这样做(参见index.yaml文件)。