【问题标题】:Are indexes good or bad for a large database?对于大型数据库,索引是好是坏?
【发布时间】:2010-04-26 07:45:45
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 没有索引就无法呼吸!
  • 在您自己的数据库上运行比较测试做得很好。在性能方面,测试总是会告诉我们哪种方式更快。

标签: mysql performance indexing


【解决方案1】:

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

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

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

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

如果您最终读取了大部分或接近大部分实际存在问题的表,那么处理索引所需的所有工作可能比一开始就进行全表扫描的开销更大。

现在,这就是文章所说的全部。对于大多数处理数据库的工作,使用索引是正确的做法。

例如,如果您需要提取一小组行,通过索引而不是全表扫描将快很多数量级。

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

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

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

【讨论】:

  • 正如文章所说,“即使您查看 1% 或行或更少的全表扫描也可能会更快。”所以不要跛脚,但答案似乎是“这取决于具体情况。”
【解决方案2】:

一如既往,视情况而定。到目前为止,我从未遇到过该博客文章中描述的情况。对我的大型(50+ 百万行)查询使用索引比对这些大表执行全表扫描快 100 到 10000 倍。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2011-10-04
      • 2021-05-23
      • 2012-01-21
      • 2020-06-20
      • 1970-01-01
      • 2011-01-16
      • 2011-05-29
      • 2014-03-12
      相关资源
      最近更新 更多