2010-04-26 79 views
7

我在MySQL Performance Blog上读到,当表很大时,最好扫描整个表,而不是使用索引。对于大型数据库,索引是好还是坏?

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

感谢

+1

即使没有指标也无法呼吸! – 2010-04-26 07:54:47

+0

在你自己的数据库上运行比较测试的好工作。当它达到性能时,测试总是会告诉哪种方式更快。 – phkahler 2010-04-27 13:51:01

回答

8

该文章说,在处理非常大的数据集时,如果需要使用的行数接近表中的行数,则使用索引可能会损害性能。

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

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

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

如果您最终读到的是大多数或接近大多数实际表格,处理索引所需的所有工作可能比开始进行全表扫描要花费更多的开销。

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

例如,如果您需要提取一小组行,则通过索引而不是全表扫描的速度将会快很多。

在任何情况下,如果您有疑问,您应该执行一些性能分析以了解您的应用程序在不同类型的加载情况下的行为,然后开始调整,不要将单个项目作为银色子弹为了任何东西。

例如,加快文章中的pad列的示例查询的一种方法是创建一个覆盖valpad的单个索引,这样计数将简单地索引扫描,而不是索引扫描+表格查找,并且运行速度比全表扫描要快。

你最好的选择是知道你的数据,并进行实验,并知道你使用的工具是如何工作的,所以确实,了解更多关于索引的知识,但最终,你是谁决定什么是最好的为你的程序。

+1

正如文章所说:“即使你看1%或更少的行,全表扫描可能会更快。”所以不要跛脚,但答案似乎是“这取决于具体情况”。 – 2010-04-26 07:58:36

+0

是的,的确如此。 – 2010-04-26 08:00:44

1

这是很好的做法,把指数,你在WHERE子句使用的每一列。

2

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

这里可能没有银弹,你必须测试你的特定数据和你的特定查询。