目录

前言:

1.最佳左前缀法则

2.主键插入顺序

3.计算、函数、类型转换(自动或手动)导致索引失效

4.范围条件右边的列索引失效

5.不等于(!= 或者<>)导致索引失效

6.is null可以使用索引,is not null无法使用索引

7.like以通配符%开头索引失效

8.OR 前后只要存在非索引的列,都会导致索引失效

9.数据库和表的字符集统一使用utf8mb4

特别鸣谢:


前言:

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。

  • 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。
  • 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。

大多数情况下都(默认)采用B+ 树来构建索引。只是空间列类型的索引使R- 树,并且MEMORY 表还支持hash 索引。其实,用不用索引最终都是优化器说了算

优化器是基于什么的优化器? 基于cost开销(CostBaseOptimizer) ,它不是基于规则( Rule-BasedOptimizer),也不是基于语义。怎么样开销小就怎么来。另外, SQL 语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系

1.最佳左前缀法则

拓展:Alibaba
Java开发手册》
索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

2.主键插入顺序

 如果此时再插入一条主键值为 9 的记录,那它插入的位置就如下图:

        可这个数据页已经满了,再插进来咋办呢?我们需要把当前 页面分裂 成两个页面,把本页中的一些记录移动到新创建的这个页中。页面分裂和记录移位意味着什么?意味着: 性能损耗 !所以如果我们想尽量 避免这样无谓的性能损耗,最好让插入的记录的 主键值依次递增 ,这样就不会发生这样的性能损耗了。
        所以我们建议:让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键,

在插入记录时存储引擎会自动为我们填入自增的主键值。这样的主键占用空间小,顺序写入,减少页分裂。

3.计算、函数、类型转换(自动或手动)导致索引失效

4.范围条件右边的列索引失效

例子:
#创建一个联合索引,注意字段的顺序
create index idx_age_classid_name on student(age,classid,name);
#执行计划
EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student.age=30 AND student.classId>20 AND student.name = 'abc' ;  

#再创建一个联合索引,与上面的索引对比字段顺序变了

create index idx_age_name_classid on student(age,name,classid);

#再执行一模一样的执行计划

EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student.age=30 AND student.classId>20 AND student.name = 'abc' ;

看到两个执行计划虽然都用到了索引,但是:

  • 第一个没用全,只用到了联合索引“idx_age_classid_name” 的age和classid。
  • 第二个把联合索引“idx_age_name_classid”的age,name和classid都用上了。

5.不等于(!= 或者<>)导致索引失效

6.is null可以使用索引,is not null无法使用索引

7.like以通配符%开头索引失效

拓展:Alibaba《Java开发手册》
【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。

8.OR 前后只要存在非索引的列,都会导致索引失效 

9.数据库和表的字符集统一使用utf8mb4

        统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

特别鸣谢:

以上知识来源于“尚硅谷”,宋红康老师的《MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!》系列课程。

所以本文章看不懂的卷王们可以去搜索宋红康老师的mysql系列课程。

mysql索引失效的常见9种原因详解相关推荐

  1. 【第三篇】MySQL 索引失效的常见原因【重点】

    1.1 概述    有时候不知道小伙伴有没有跟我一样的情况,明明已经建立了索引,但是通过explain发现语句并没有使用上索引,这可能是某些原因导致了我们的索引失效.所以本篇主要介绍的是索引失效的常见 ...

  2. 十二、一篇文章帮助你快速读懂MySQL索引(B树、B+树详解)

    2. 索引 2.1 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某 ...

  3. MySQL 索引检索原理和B+Tree数据结构详解

    思考 试想下,如果MySQL中没有数据结构,那么查询过程会是个什么样的? 假设,表格中的圆圈,都是每一行数据,然后查询的话,得每次去一个一个比对数据,如果最后一个是想要的数据,那么得比对7次,如果20 ...

  4. Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到 ...

  5. like左匹配索引失效_导致MySQL索引失效的一些常见写法总结

    前言 最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用 ...

  6. 什么情况会导致 MySQL 索引失效?

    为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...

  7. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

  8. MySQL 索引失效的 15 种场景!

    背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑.常见的现象就是:明明在字段上添加了索引,但却并未生效. 前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参 ...

  9. MySQL索引失效的9种情况(针对InnoDB存储引擎)

    前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能. 因此,索引对查询的速度有着至关重要的影响. 为了尽量的使优化器用到我们的 ...

  10. 详解MySQL索引失效的几种情况

    MySQL索引是提高查询效率的重要手段.索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能.以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且o ...

最新文章

  1. Runtime编译环境搭建
  2. 掌握这10个Python小技巧,让你敲代码速度快5倍不止
  3. 用VC++实现console程序显示彩色文本
  4. 6个实例,8段代码,详解Python中的for循环
  5. python数组扩充_【Python】Numpy扩充数组函数之repeat和tile用法,
  6. Python中enumerate对象的用法与特点
  7. 蓝桥杯 ADV-204 算法提高 快速幂
  8. Qt: 非阻塞时间延迟;
  9. Eclipse无法查看Servlet源代码的解决方案
  10. 软件工程——第六次作业——团队作业
  11. 输入1到100带圈字符Ⓢ你以为很容易的/其实特容易翻车的需求
  12. lex 词法分析 linux,Lex词法分析器
  13. Mint UI - 饿了么出品的开源、轻量的移动端 UI 组件库
  14. 基于FPGA的超声成像算法的硬件设计
  15. Ubuntu系统搭建Discus论坛
  16. 计算机怎么看事件管理,win7系统事件查看器怎么打开
  17. html css文字标题特效,用CSS做一个流光溢彩的文字特效
  18. 解决windows10 无法开热点问题
  19. 关于遍历,看这篇文章就足够了【find()、findIndex()、forEach()、splice()、slice()详解】
  20. ubuntu 启动 meld、diffuse失败

热门文章

  1. 塔式太阳能热发电技术在我国发展现状与前景分析
  2. Java基础——环境变量配置、注释、关键字、标识符
  3. 甲骨文裁员犯的病,任正非早在10年前就开出了药方
  4. 17.1.1 颜色和 RGBA 值
  5. python处理xps文件_xps/pdf/png/json转换
  6. java 打印 xps_使用PrintTicket打印XPS,OutputColor PagesPerSheet无效
  7. 上传图片时出现http 415错误
  8. 相似图片搜索的原理(二)【作者: 阮一峰】
  9. java.sql.SQLException: 列名无效
  10. 层次时间序列预测指南