USE_RANGE_CACHE 和 NO_RANGE_CACHE 是一对作用于查询优化器的语句级 Hint,用于控制单条 SQL 在估算 Range 扫描行数时是否使用 Range Cache(范围统计缓存)。range_stat_enable_cache 控制全局开关。在该全局开关之外,可以通过下列两个 Hint 对单条 SQL 临时调整行为:USE_RANGE_CACHE:强制对该语句启用 Range Cache,即使全局开关 range_stat_enable_cache 为 OFF。NO_RANGE_CACHE:强制对该语句关闭 Range Cache,即使全局开关 range_stat_enable_cache 为 ON。USE_RANGE_CACHE 和 NO_RANGE_CACHE 是无参 Hint,作用于整条语句,不接受表名、索引名或查询块名等参数。/*+ USE_RANGE_CACHE *//*+ NO_RANGE_CACHE */
SELECT、UPDATE、DELETE 等关键字之后即可。SELECT、UPDATE、DELETE 语句均支持。USE_RANGE_CACHE 和 NO_RANGE_CACHE(或重复指定同一个 Hint)会触发冲突告警 ER_WARN_CONFLICTING_HINT,并以首先出现的 Hint 为准。USE_RANGE_CACHE 仅在以下条件下生效,否则即使指定 Hint,Range Cache 也不会建立或使用:range_stat_allowed_maximum_table_size 指定的阈值。NO_RANGE_CACHE 不受上述存储引擎限制,对任何 SQL 均可关闭 Range Cache 估算路径。USE_RANGE_CACHE 与 NO_RANGE_CACHE 控制单条 SQL 的 Range Cache 行为,并通过 information_schema.RANGE_CACHE 验证缓存使用情况。CREATE TABLE range_cache_demo (id INT NOT NULL,f1 INT DEFAULT NULL,f2 INT DEFAULT NULL,f3 INT DEFAULT NULL,PRIMARY KEY (id),KEY idx_f1 (f1),KEY idx_f2 (f2),KEY idx_f3 (f3, f2)) ENGINE = ROCKSDB DEFAULT CHARSET = utf8mb4;
NO_RANGE_CACHE 关闭 Range Cacherange_stat_enable_cache = ON 的情况下,针对单条 SQL 关闭 Range Cache:SELECT /*+ NO_RANGE_CACHE */ COUNT(1)FROM range_cache_demoWHERE f1 = 10;
UPDATE 与 DELETE 语句同样支持:BEGIN;UPDATE /*+ NO_RANGE_CACHE */ range_cache_demoSET f1 = 1WHERE f1 = 10;ROLLBACK;
USE_RANGE_CACHE 强制启用 Range CacheSET GLOBAL range_stat_enable_cache = OFF;SELECT /*+ USE_RANGE_CACHE */ COUNT(1)FROM range_cache_demoWHERE f1 = 10;SET GLOBAL range_stat_enable_cache = ON;
optimizer_trace 查看 Hint 生效细节SET optimizer_trace = 'enabled=on';SET range_stat_enable_trace_cache = ON;SELECT /*+ USE_RANGE_CACHE */ COUNT(1)FROM range_cache_demoWHERE f1 = 10;SELECT * FROM information_schema.optimizer_trace\\G
optimizer_trace 输出中可以看到 Range Cache 的估算细节,用于确认 Hint 是否被采纳以及具体的估算行数。USE_RANGE_CACHE 与 NO_RANGE_CACHE 仅影响 Range 扫描行数估算阶段的代价计算路径,不会改变实际的数据扫描算子,也不会跳过权限校验、事务可见性等正常执行流程。range_stat_allowed_maximum_table_size)时,USE_RANGE_CACHE 将自动失效,回退到默认估算路径,不会产生执行错误。文档反馈