当前位置: 首页 > news >正文

mysql 索引失效的场景

思考

最左匹配

join字符集

函数

null @定义字段 not null default ""

or @union all

like

字段区分度不大

+++++

!=

not in @between 

varchar类型数字型,查询不是字符串查询

MySQL 索引失效的常见场景

MySQL 索引失效会导致查询性能急剧下降,以下是索引失效的主要场景及其原理分析:

1. 违反最左前缀原则

场景:复合索引未从最左列开始使用

sql

-- 复合索引为 (a, b, c)
WHERE b = 1 AND c = 2  -- 索引失效
WHERE a = 1 AND c = 2  -- 只用到a列索引

原理:复合索引按照从左到右的顺序建立B+树结构

2. 对索引列进行计算或函数操作

场景:对索引字段进行运算或函数处理

sql

-- 索引列:create_time
WHERE YEAR(create_time) = 2023  -- 索引失效
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'  -- 有效-- 索引列:age
WHERE age + 1 > 20  -- 索引失效
WHERE age > 19  -- 有效

3. 使用不等于(!= 或 <>)

场景:使用不等于条件

sql

-- 索引列:status
WHERE status != 1  -- 索引失效

例外:覆盖索引时可能仍会使用索引

4. 使用 IS NULL 或 IS NOT NULL

场景:判断NULL值

sql

-- 索引列:name
WHERE name IS NULL  -- 可能失效(取决于数据分布)

优化:设置默认值替代NULL

5. 使用LIKE以通配符开头

场景:模糊查询

sql

-- 索引列:title
WHERE title LIKE '%关键字%'  -- 索引失效
WHERE title LIKE '关键字%'   -- 可以使用索引

6. 隐式类型转换

场景:字段类型与条件值类型不一致

sql

-- 索引列:mobile(varchar)
WHERE mobile = 13800138000  -- 索引失效(数字转字符串)
WHERE mobile = '13800138000'  -- 有效

7. 使用OR条件不当

场景:OR连接非索引列

sql

-- 索引列:a
WHERE a = 1 OR b = 2  -- 索引失效(如果b无索引)

优化:改用UNION ALL

sql

SELECT * FROM table WHERE a = 1
UNION ALL
SELECT * FROM table WHERE b = 2

8. 索引列使用NOT IN

场景:否定条件查询

sql

-- 索引列:id
WHERE id NOT IN (1, 2, 3)  -- 索引失效

替代方案

sql

WHERE id < 1 OR id > 3  -- 可能使用索引

9. 数据分布不均匀

场景:索引列值区分度低

sql

-- 索引列:gender(只有'M','F'两种值)
WHERE gender = 'M'  -- 可能放弃索引(全表扫描更快)

解决方案:建立复合索引提高区分度

10. 使用ORDER BY不当

场景:排序字段与索引顺序不一致

sql

-- 索引(a, b)
ORDER BY b, a  -- 索引失效

11. JOIN条件字符集不匹配

场景:关联字段字符集不同

sql

-- table1.utf8_col JOIN table2.latin1_col
-- 索引失效

12. 索引列使用表达式

场景:索引列参与表达式

sql

-- 索引列:price
WHERE price * 0.8 > 100  -- 索引失效
WHERE price > 100 / 0.8  -- 有效

检测索引是否失效的方法

  1. EXPLAIN分析

    sql

    EXPLAIN SELECT * FROM table WHERE ...

    查看type列:

    • ref/range:使用索引

    • ALL:全表扫描

  2. 开启优化器跟踪

    sql

    SET optimizer_trace="enabled=on";
    SELECT * FROM table WHERE ...;
    SELECT * FROM information_schema.optimizer_trace;

文章转载自:
http://acetonaemia.isnyv.cn
http://airlift.isnyv.cn
http://cfido.isnyv.cn
http://chaw.isnyv.cn
http://anele.isnyv.cn
http://artistry.isnyv.cn
http://batoon.isnyv.cn
http://burrito.isnyv.cn
http://aerobody.isnyv.cn
http://arrect.isnyv.cn
http://bode.isnyv.cn
http://alternatively.isnyv.cn
http://airburst.isnyv.cn
http://aristocratic.isnyv.cn
http://bacterin.isnyv.cn
http://aplastic.isnyv.cn
http://amaryllis.isnyv.cn
http://cheese.isnyv.cn
http://apocrypha.isnyv.cn
http://cascaron.isnyv.cn
http://ceterach.isnyv.cn
http://botheration.isnyv.cn
http://begotten.isnyv.cn
http://cantonization.isnyv.cn
http://anthropotomy.isnyv.cn
http://bandsaw.isnyv.cn
http://blocking.isnyv.cn
http://affined.isnyv.cn
http://aggrandize.isnyv.cn
http://agamy.isnyv.cn
http://www.dtcms.com/a/280134.html

相关文章:

  • HashMap深入讲解
  • 从零开始的python学习(八)P115+P116+P117+P118+P119+P120+P121+P122
  • 部署本地大模型 Ollama + LLaMA3
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • GPIO 输入/输出
  • GEO革命:当AI推荐成为新战场,传统SEO如何进化?
  • Linux基础学习---目录相关命令
  • 手机当路由,连接机器人和电脑
  • Typecho插件开发:实现文章字数统计与阅读时长计算功能
  • docker 方式gost代理搭建以及代理链实施
  • Android弹窗
  • uniapp中全局引入ronMounted, ref,watch onLoad,onShow等
  • Vim多列操作指南
  • docker-compose 配置启动2个MongoDB
  • SQL 常用版本语法概览:标准演进与关键语法分析
  • bat 批处理实现 FFmpeg 命令导出 mov 到 png 序列帧
  • 新版本PyCharm Conda环境设置 “找不到conda可执行文件”的解决
  • Git分支管理与工作流详解
  • 记录一条sql面试题2
  • MyBatis动态语法标签速查
  • Fastapi框架总览与核心架构
  • iOS App 上架工具选型与跨平台开发 iOS 上架流程优化实录
  • 深入探讨Hadoop YARN Federation:架构设计与实践应用
  • Datawhale AI数据分析 笔记
  • 2025开放原子开源生态大会 | openKylin的技术跃迁和全球协作
  • 回顾一下Docker的基本操作
  • Linux部署Python服务
  • 面向医疗AI场景的H20显卡算力组网方案
  • 2025开放原子开源生态大会 | 开源欧拉的AI原生实践与全球协作
  • 应用部署作业-02-流程