首页 > 解决方案 > 系统不喜欢使用索引

问题描述

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

朋友是主键

标签: mysqlsqldatabase

解决方案


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

使用索引会产生开销:

  • 索引页需要读入内存。
  • 相关的数据页也需要读入内存。
  • 数据页没有按顺序访问,这可能会导致在低内存(大数据)情况下出现抖动。

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

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

第二种可能性是使用minutes第一个键创建聚集索引。您的情况可能不保证聚集索引,但这也会限制数据库仅读取它需要的数据。


推荐阅读