MySQL如何基于字段后N个字符创建函数式索引?
基于字段后N个字符创建MySQL函数式索引
你的写法INDEX ((RIGHT(col2,3)))是正确的,但要注意:仅MySQL 8.0.13及以上版本支持这种表达式索引(函数式索引)。下面结合库存类场景给你完整代码示例:
1. 创建带函数式索引的库存表
假设你有混合编码的库存SKU(比如PROD-1234、WARE-567),现在要给sku字段的后3个字符创建索引:
CREATE TABLE inventory ( id INT AUTO_INCREMENT PRIMARY KEY, sku VARCHAR(50) NOT NULL, goods_name VARCHAR(100) NOT NULL, stock_num INT DEFAULT 0, -- 基于sku后3位创建函数式索引,注意双层括号包裹表达式 INDEX idx_sku_last3 ((RIGHT(sku, 3))) );
2. 插入测试数据
INSERT INTO inventory (sku, goods_name, stock_num) VALUES ('PROD-123', '无线鼠标', 150), ('PROD-456', '机械键盘', 80), ('WARE-789', '仓库备用线材', 300), ('PROD-123', '无线鼠标(升级款)', 60);
3. 利用索引查询的场景
当你需要筛选SKU后3位为指定值的库存时,索引会生效:
-- 查询SKU后3位是123的所有库存 SELECT * FROM inventory WHERE RIGHT(sku, 3) = '123';
4. 验证索引是否生效
用EXPLAIN查看执行计划,确认索引被命中:
EXPLAIN SELECT * FROM inventory WHERE RIGHT(sku, 3) = '123';
如果结果中type列显示ref,key列显示idx_sku_last3,说明索引正常工作。
低版本MySQL兼容方案(8.0.13以下)
如果你的MySQL版本不支持表达式索引,可以新增存储计算列再建索引:
CREATE TABLE inventory ( id INT AUTO_INCREMENT PRIMARY KEY, sku VARCHAR(50) NOT NULL, goods_name VARCHAR(100) NOT NULL, stock_num INT DEFAULT 0, -- 自动生成sku后3位的存储列 sku_last3 VARCHAR(3) GENERATED ALWAYS AS (RIGHT(sku, 3)) STORED, -- 给计算列建索引 INDEX idx_sku_last3 (sku_last3) );
查询时直接用计算列筛选即可命中索引:
SELECT * FROM inventory WHERE sku_last3 = '123';
内容的提问来源于stack exchange,提问作者Xiong
相关产品推荐
相关产品推荐

