如果我在一个包含13列的表中创建8个索引,这样可以吗?
如果我从中选择数据并按键对结果进行排序,则查询速度非常快,但如果排序字段不是键,则速度要慢得多。比较慢40倍。
我基本上要问的是,如果在数据库中有很多键有任何副作用......
答案 0 :(得分:8)
在表上创建索引可以减慢所有写操作的速度,但会加快相关列上的读取操作。如果你的应用程序不会对该表进行大量的写操作(对大多数应用程序来说都是如此)那么你就没事了。
答案 1 :(得分:5)
不要创建冗余或未使用的索引。但是,请创建优化所运行查询所需的索引。
您可以根据查询在任何表格中选择索引。每个查询可能使用不同的索引,因此仔细分析您的查询是值得的。请参阅我的演示文稿MENTOR Your Indexes。我还在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中的索引章节中介绍了类似的信息。
没有关于有多少索引太多的具体规则。在Oracle SQL Tuning Pocket Reference中,作者Mark Gurry说:
我的建议是避免规则说明网站不会有超过一定数量的索引。底线是所有SQL语句都必须可以运行。总有办法实现这一目标。如果它需要表上的10个索引,那么你应该在表上放置10个索引。
有一些很好的工具可以帮助您在Percona Toolkit中找到MySQL的冗余或未使用的索引:http://www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html和pt-index-usage。
答案 2 :(得分:2)
这是一个很好的问题,每个使用mysql的人都应该知道答案。它也是常见的问题。以下是其中一个链接的链接:
答案 3 :(得分:2)
简而言之,每个新索引都需要空间(特别是如果您使用InnoDB - 请参阅this article中的“群集的缺点”部分)并减慢INSERT,UPDATE和DELETE。
只有您能够决定是否加速进入SELECT以及使用它的频率是否值得。但无论你最终决定什么,请确保你的决定基于测量,而不是猜测!
P.S。使用WHERE的INSERT,UPDATE和DELETE也可以通过索引来加速,但那是另一个主题......
答案 4 :(得分:2)
磁盘空间中索引的成本通常很小。在表更改时更新索引的额外写入的成本通常是适中的。额外锁定的成本可能很高。
这取决于表上的读取与写入比率,以及索引实际用于加速查询的频率。
索引占用磁盘空间来存储,并且需要时间来创建和维护。未使用的没有任何好处。如果查询有许多候选索引,则可以通过让服务器为查询选择“错误”索引来减慢查询速度。
使用这些因素来决定是否需要索引。
通常可以创建永远不会被使用的索引 - 例如,只有两个可能值的(非空)字段上的索引几乎肯定是无用的。
您需要解释自己的应用程序的查询,以确保频繁执行的查询在可能的情况下使用合理的索引,并且不要创建比执行此操作所需的索引更多的索引。
您可以通过以下链接获取更多信息: 对于mysql: http://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL
答案 5 :(得分:1)
索引可提高读取性能,但会增加大小,并降低插入/更新的速度。 8个索引对我来说似乎有点太多了;但是,这取决于您通常更新表格的频率
答案 6 :(得分:1)
假设来自标签的MySQL,即使OP没有提及它。
您应该编辑您的问题并添加您正在进行order by
操作的事实(从您发布到解决方案的评论中)。 order by
操作也会减慢查询速度(各种其他mysql操作也会如此),因为MySQL必须创建临时表来完成有序的结果集(更多信息here)。很多时候,如果数据集允许,我会提取我需要的数据,然后在应用层进行排序以避免这种惩罚。
最好的办法是解析最常用的查询,并查看慢速查询日志。