示例
示例
-- 原写法:列上做 YEAR() 运算,索引失效
SELECT * FROM orders WHERE YEAR(created_at) = 2024;
-- 改写为范围条件,可走 idx_created
SELECT * FROM orders
WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
-- MySQL 8.0.13+ 也可建函数索引(表达式需要括号包裹)
ALTER TABLE orders ADD INDEX idx_year ((YEAR(created_at)));
-- PostgreSQL 表达式索引
CREATE INDEX idx_orders_year ON orders ((EXTRACT(YEAR FROM created_at)));| 原则 | 保持索引列“裸用”:把运算移到常量一侧 |
|---|---|
| 函数索引 | MySQL 8.0.13+ 与 PG 均支持表达式索引;查询表达式必须与索引表达式一致 |
| 常见场景 | 日期函数、字符串大小写、JSON 提取、CAST 转换 |