如果我创建索引,SQL查询要快得多

时间:2011-12-09 22:54:13

标签: php mysql database

如果我在一个包含13列的表中创建8个索引,这样可以吗?

如果我从中选择数据并按键对结果进行排序,则查询速度非常快,但如果排序字段不是键,则速度要慢得多。比较慢40倍。

我基本上要问的是,如果在数据库中有很多键有任何副作用......

7 个答案:

答案 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.htmlpt-index-usage

答案 2 :(得分:2)

这是一个很好的问题,每个使用mysql的人都应该知道答案。它也是常见的问题。以下是其中一个链接的链接:

Indexing every column in a table

答案 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

对于DB2: http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005052.htm

答案 5 :(得分:1)

索引可提高读取性能,但会增加大小,并降低插入/更新的速度。 8个索引对我来说似乎有点太多了;但是,这取决于您通常更新表格的频率

答案 6 :(得分:1)

假设来自标签的MySQL,即使OP没有提及它。

您应该编辑您的问题并添加您正在进行order by操作的事实(从您发布到解决方案的评论中)。 order by操作也会减慢查询速度(各种其他mysql操作也会如此),因为MySQL必须创建临时表来完成有序的结果集(更多信息here)。很多时候,如果数据集允许,我会提取我需要的数据,然后在应用层进行排序以避免这种惩罚。

最好的办法是解析最常用的查询,并查看慢速查询日志。