索引对于大型数据库是好还是坏?

时间:2010-04-26 07:45:46

标签: mysql performance indexing

我在MySQL Performance Blog上读到,当表很大时,最好扫描完整的表,而不是使用索引。

我有一张包含数千万行的表格。在进行查询时,如果我不使用索引,那么查询比使用索引慢24倍。我知道很多事情可能会导致这种情况(例如,行是按顺序存储的),但是请你给我一些提示可能会发生什么?或者我应该如何开始研究这个问题?我想了解何时首选使用索引以及何时不使用索引

由于

3 个答案:

答案 0 :(得分:8)

文章说,在处理非常大的数据集时,您需要处理的行数接近表中的行数,使用索引可能会影响性能。

在这种情况下,只要您需要的数据多于索引中的数据,那么浏览索引确实会损害性能。

要遍历索引,数据库引擎首先必须读取索引表的大部分内容(它是一种表格类型),然后对于每个行(或一组行),从此结果转到真实表并开始挑选阅读页面。

另一方面,如果您只需要检索已经成为索引表一部分的区域的列,那么数据库引擎只需从中读取,而不是继续查看整个表以获取更多数据。

如果你最终阅读大部分或接近大多数有问题的实际表,那​​么处理索引所需的所有工作可能比仅仅进行完整的表扫描开销更多。

现在,这篇文章是所有。对于处理数据库的大多数工作,使用索引是完全正确的事情。

例如,如果你需要提取一小组行,那么通过索引而不是全表扫描将会更快的数量级。

在任何情况下,如果您有疑问,您应该进行一些性能分析,以了解您的应用程序在不同类型的负载下的行为,然后开始调整,不要将一篇文章作为银弹任何东西。

例如,加快对文章pad列进行计数的示例查询的一种方法是创建涵盖val和{{1}的单个索引以这种方式,计数只是一个索引扫描,而不是索引扫描+表查找,并且运行速度比完整的表扫描更快。

您最好的选择是了解您的数据,进行实验,并了解您使用的工具是如何工作的,所以确实了解了有关索引的更多信息,但最终,谁决定什么是最适合您的计划。

答案 1 :(得分:2)

一如既往,这取决于。到目前为止,我还没有碰到博客文章中描述的场景。在我的查询中使用大型(超过50万行)的索引比在这些大表上进行全表扫描快100到10000倍。

这里可能没有灵丹妙药,你必须测试你的特定数据和你的特定查询。

答案 2 :(得分:1)

最好将索引放在 WHERE 子句中使用的每一列上。