mysql索引失效的常见原因与解决方法-mysql教程

MySQL索引失效的五大场景:①WHERE中对索引列使用函数/表达式;②LIKE以通配符开头;③隐式类型转换;④联合索引未遵循最左前缀原则;⑤索引过多或结构不匹配查询模式,需结合EXPLAIN验证。

WHERE 条件中对索引列使用函数或表达式

MySQL 无法使用索引进行快速查找,只要在 WHERE 子句里对索引列做了计算、函数调用或类型转换,优化器就会放弃走索引。比如 WHERE YEAR(create_time) = 2023 或 WHERE price + 10 > 100,哪怕 create_time 和 price 都建了索引,也会全表扫描。

  • 改写为范围查询:WHERE create_time >= '2023-01-01' AND create_time
  • 避免在索引列上做运算,把计算移到等号右边(如 WHERE price > 90 而非 WHERE price + 10 > 100)
  • 如果必须用函数,可考虑生成列(generated column)+ 索引:
    ALTER TABLE orders ADD COLUMN year_create INT AS (YEAR(create_time)) STORED;
    CREATE INDEX idx_year_create ON orders(year_create);

LIKE 查询以通配符开头

LIKE '%abc' 或 LIKE '%abc%' 会导致索引失效,因为 B+ 树索引是按字典序排序的,前缀不固定就无法定位起始位置。

  • 能用 LIKE 'abc%' 就绝不用 LIKE '%abc'
  • 全文检索场景改用 FULLTEXT 索引 + MATCH ... AGAINST
  • 模糊匹配需求强且数据量大时,考虑外部方案(Elasticsearch、Redisearch)

隐式类型转换导致索引失效

当索引列是字符串类型(如 VARCHAR),而 WHERE 中传入的是数字(WHERE mobile = 13812345678),MySQL 会自动把字段转成数字比较,触发全表扫描。同理,字符集不一致(如 utf8mb4 vs utf8)也可能触发隐式转换。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » mysql索引失效的常见原因与解决方法-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003125+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4003125+
  • 本周更新: 0+
  • 最后更新: 2026-03-16