You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:02:02