mysql - 系统不喜欢使用索引
问题描述
我有一个表 Relations(Friend,minutes) ,其中分钟均匀分布在区间 [0; 500]。考虑条件 B ≥ 250 的查询。为了优化此查询,我在几分钟内创建了一个非聚集索引。但是,系统不喜欢使用索引。为什么?
朋友是主键
解决方案
查询中索引的主要目的之一是减少正在访问的数据页的数量。每个数据页通常包含许多记录——几十个或几百个。
使用索引会产生开销:
- 索引页需要读入内存。
- 相关的数据页也需要读入内存。
- 数据页没有按顺序访问,这可能会导致在低内存(大数据)情况下出现抖动。
如果您正在访问一半的记录,那么您仍在访问所有数据页。结果,数据库优化器决定将它们全部读取并进行比较,而不是调用索引更便宜。
你能做什么?一种选择是创建一个涵盖您的查询的索引。也就是说,不是索引,而是(minutes)
索引(minutes, friend)
。因为所有列都在索引中,所以不需要访问数据页。
第二种可能性是使用minutes
第一个键创建聚集索引。您的情况可能不保证聚集索引,但这也会限制数据库仅读取它需要的数据。
推荐阅读
- datetime - 弹出的日期选择器不允许手动输入值
- javascript - PDF 快照 Javascript 按钮
- json - 如何使用 vba 获取 json 数组中的数据?
- javascript - 如何等待异步功能并收集响应
- php - Font Awesome 在 Laravel 5.8 管理面板中不起作用
- ld - MIPS 上的“HelloWorld”程序在由 linux 内核加载到另一个内核时不起作用
- kubernetes - 如何在 GKE 中使用负载均衡器后面的入口?
- datastage - 在不使用 Unix 命令的情况下在 UNIX 中读取文件(可能是 Datastage 例程)
- inno-setup - 升级应用程序 - 桌面图标 - Inno
- c++ - 编写一次性“如果”的最优雅方式