索引在 MySQL 中变得有价值的最小行数是多少?



我读到过一些数据库上的索引(SQL Server是我读到的关于的数据库)在超过某个行阈值之前不会有多大效果,因为数据库将在内存中保存整个表X。

通常,我会计划对我的WHERE和唯一列/更改较少的表进行索引。在听说了建议的最小值(约10k)后,我想了解更多关于这个想法的信息。如果我知道有些表永远不会通过某一点,这可能会改变我对其中一些表的索引方式。

对于MySQL MyISAM/INNODB这样的东西,是否存在索引几乎没有价值的情况?有什么方法可以确定这一点?

注意:恕我直言,我并不是在寻求关于构建我的数据库的建议,比如"无论如何你都应该索引",我只是想了解这个概念,如果它是真是假,如何确定阈值,以及类似的信息。

索引的主要用途之一是减少读取的页数。索引本身通常比表小。因此,仅就页面读/写而言,您通常需要至少三个数据页才能看到好处,因为使用索引至少需要两个数据页(一个用于索引,一个用于原始数据)。

(实际上,如果索引覆盖了查询,则盈亏平衡为2。)

表所需的数据页数取决于记录的大小和行数。因此,实际上不可能指定行数的阈值。

上面非常基本的解释遗漏了一些东西:

  • 扫描数据页以对每一行进行比较的成本
  • 加载和使用索引页的成本
  • 索引的其他用途

但它给了你一个想法,你可以在小于10k行的表上看到好处。也就是说,你可以很容易地对数据进行测试,看看查询是如何在有问题的表上工作的。

此外,我强烈建议在所有表上都有主键,并将这些键用于外键关系。主键本身是一个索引。

索引有很多用途。InnoDB表总是作为一个索引组织在集群键上。索引可用于强制执行唯一约束,以及支持外键约束。"索引"主题的范围远远不止查询性能。

就查询性能而言,它实际上取决于查询在做什么。如果我们从大集合中选择一小部分行,那么有效地使用索引可以通过消除大量行的检查来加快速度。这就是最大的爆炸的来源。

如果我们从一个集合中提取所有行,或者几乎所有行,那么索引通常无助于缩小要检查的行的范围;即使索引可用,优化器也可以选择对所有行进行完全扫描。

但是,即使在提取大型子集时,通过使用索引按顺序检索行,而不需要"使用文件排序"操作,适当的索引也可以提高联接操作的性能,并可以显著提高GROUP BY或ORDER BY子句查询的性能。

如果我们正在寻找一个简单的经验法则。。。对于大型集合,如果我们需要提取(或查看)不到总行数的10%,那么使用适当索引的访问计划通常会优于完全扫描。如果我们正在寻找一个特定的行,基于一个唯一的标识符,索引将比完全扫描更快。如果我们不按特定顺序为表中的每一行提取所有列,那么完全扫描会更快。

同样,这实际上取决于正在执行的操作。正在执行哪些查询,以及我们从这些查询中需要的性能概要文件。这将是决定索引策略的关键。

为了获得理解,请使用EXPLAIN查看执行计划。并学习MySQl优化器可用的操作。

(就数据库性能而言,索引策略的主题对于StackOverflow问题来说太大了。)

每种情况都不同。如果你分析你的代码,那么你会更好地理解每个反模式。为了证明极端的出乎意料,可以考虑Oracle:

如果这是Oracle,我会说零,因为如果一个空表的高水位线非常高,那么一个激发全表扫描并返回零行的查询将比引发全索引扫描的查询昂贵得多。

与我理解Oracle的过程相同,您可以使用MySQL:评测您的代码。

最新更新