系统不喜欢使用索引

时间:2019-05-13 18:22:27

标签: mysql sql database

我有一个表Relations(Friend,minutes),其中分钟在[0; 500]。考虑一个 条件B≥250的查询。为了优化此查询,我在几分钟内创建了一个非聚集索引。但是,系统更喜欢不使用索引。为什么?

朋友是主键

2 个答案:

答案 0 :(得分:0)

您的查询条件不是选择性的。它触及一半的记录。查询优化器认为表扫描的性能更好。

答案 1 :(得分:0)

查询中索引的主要目的之一是减少正在访问的数据页的数量。每个数据页通常包含许多记录-数十或数百。

使用索引会产生开销:

  • 索引页需要读入内存。
  • 关联的数据页也需要读入内存。
  • 未按顺序访问数据页,这可能导致在低内存(大数据)情况下崩溃。

如果您要访问一半的记录,那么您仍在访问所有数据页。结果,数据库优化程序决定将它们全部读取并进行比较比调用索引便宜。

你能做什么?一种选择是建立一个覆盖您的查询的索引。也就是说,不是索引(minutes),而是索引(minutes, friend)。因为所有列都在索引中,所以不需要访问数据页。

第二种可能性是使用minutes作为第一个键来创建聚簇索引。您可能不保证使用聚集索引,但是这也将数据库限制为仅读取所需的数据。