mysql为什么不要在索引列上做运算_mysql函数索引使用场景

张开发
2026/4/16 6:59:12 15 分钟阅读

分享文章

mysql为什么不要在索引列上做运算_mysql函数索引使用场景
WHERE name LIKE %abc 用不上索引因为B树索引需有序匹配左通配符无法从索引头开始查找只能全表扫描仅LIKE abc%等前缀匹配可用普通索引。为什么 WHERE name LIKE %abc 用不上索引因为 MySQL 的 B 树索引是按值排序存储的LIKE 左侧带通配符%abc时无法从索引头开始有序匹配优化器直接放弃走索引。不是“没建对”是根本没法用。只有 LIKE abc% 这种前缀匹配才能用上普通索引LIKE %abc% 或 LIKE %abc 在无函数索引时一律全表扫描如果字段是 utf8mb4还可能因字符集校对规则如 utf8mb4_0900_as_cs让隐式转换进一步破坏索引使用MySQL 8.0 函数索引怎么写才生效函数索引不是给任意表达式加索引而是把「计算结果」固化进索引结构里所以定义和查询必须严格一致。差一个括号、多一个 UPPER()、少一个 TRIM()索引就失效。建索引 CREATE INDEX idx_name_lower ON users ((LOWER(name))) —— 注意双括号这是 MySQL 8.0 函数索引语法查数据必须写成 WHERE LOWER(name) tom不能写 WHERE name TOM 或 WHERE UPPER(name) TOM不支持对同一列建多个函数索引比如同时建 (LOWER(name)) 和 (TRIM(name))会报错 ERROR 3962ORDER BY RAND() 为什么不能靠索引加速因为 RAND() 是非确定性函数每次调用返回不同值MySQL 无法预计算索引顺序更没法复用 B 树的有序性。哪怕你给字段建了函数索引RAND() 本身也不在索引表达式里。 OpenPerplex OpenPerplex是一个开源的AI搜索引擎致力于整合多种信息源为用户提供智能精准的搜索体验。

更多文章