前言:数据库索引优化,但是可能出现索引失效,我们该怎样防止这种情况发生呢》》

文章目录

  • 1. 案例建表:
    • 1.1 staffs表
    • 1.2 建立索引:
  • 2.案例:索引失效
    • 2.1 全面匹配索引的字段最好,第一个字段不能少,也不能,跳着使用字段。
    • 2.2 不要在索引的列上做任何操作(计算,函数(自动或者手动)类型转化),会导致索引失效而转向全表扫描
    • 2.3 存储引擎不能使用索引中范围条件右边的列:
    • 2.4 尽量使用索引覆盖 ,少用select *:
    • 2.5 在使用 != or<> 导致索引失效,全表扫描
    • 2.6 is null 或者 is not null 也会导致索引失效
    • 2.7 like以通配符%开头会变成全表扫描
    • 2.8 varchar类型 不写单引号,会索引失效!
    • 2.9 少用 or ,他也会导致索引失效!
  • 3 小总结:

1. 案例建表:

1.1 staffs表

 craete table staffs(id int  primary key auto_increment,name varchar(20) not null ,age int not null,pos varchar(20) not null comment '职位',add_time timestamp not null)ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into staffs(name,age,pos,add_time)values('z3',18,'manager',now());insert into staffs(name,age,pos,add_time)values('l4',20,'manager',now());insert into staffs(name,age,pos,add_time)values('w5',23,'manager',now());select * from staffs;

1.2 建立索引:

 alter table staffs add index idx_staffs_nameAgePos(name,age,pos);

2.案例:索引失效

下面为索引失效的一些情况:

2.1 全面匹配索引的字段最好,第一个字段不能少,也不能,跳着使用字段。



但是注意下面的例子:

直接从所建索引的第二个字段开始,则 type 是 ALL,没有用到索引。索引失效了! 第一个字段不能少!!!


但是如果只有第一个字段,索引是有效的!!!
!这情况就好比是上楼梯:修好的楼梯是一二三楼,而你使用的时候直接用二三楼,那怎么能上去!所有索引失效了!


这个中间字段没有直接有的第三个字段!
发现第一个字段显然用到了自带,但是第三个却灭有!
也不能,跳着使用字段。

!所以在使用的时候最好使用索引的全部字段,不能么有第一个字段,中间字段也不能断,那样索引就失效了

2.2 不要在索引的列上做任何操作(计算,函数(自动或者手动)类型转化),会导致索引失效而转向全表扫描


上面两个 查出来的结果相同,但是第二个用了 left()函数,看看他们两个的过程分析:

显然,第二种索引使用为 null,索引失效了!

2.3 存储引擎不能使用索引中范围条件右边的列:

当我们所查列中包含范围的情况:

我们可以看出 name,age 用到了索引,后面的没用到索引,type 从 ref --》range 效率还降低了
索引又失效了!

!通俗的说就是使用范围的情况之后,索引就失效了

2.4 尽量使用索引覆盖 ,少用select *:


当查询字段是索引所包含的列时候,出现了using index ,索引覆盖!这种情况就比前者更好!

2.5 在使用 != or<> 导致索引失效,全表扫描

看下图:

使用!= 或者 <> 索引失效!

2.6 is null 或者 is not null 也会导致索引失效

看结果:

2.7 like以通配符%开头会变成全表扫描


上图三条sql 除了like后面的%位置不同,其他都一样。可以看出以% 开头都是全部扫描!
通配符的位置不同,查结果不同

但是 必须使用这情况应该怎样解决!

!使用索引覆盖可以优化这种情况

这样就可了!

2.8 varchar类型 不写单引号,会索引失效!


原因是mysql自动产生了类型转化!!!

2.9 少用 or ,他也会导致索引失效!


结果可以查出来,但是过程曲折!

3 小总结:

假设符合索引 inded(a,b,c);
做下面的题!

可看其他案例:三表案例

MySQL高级:索引优化之防止索引失效相关推荐

  1. mysql覆盖索引解决模糊查询失效_关于MySQL的SQL优化之覆盖索引

    前些天,有个同事跟我说:"我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?". 我对他提供的case进行了 ...

  2. MySQL第10天:MySQL索引优化分析之索引介绍

    MySQL索引优化分析之索引简介 1.索引是什么? 2.索引优势.劣势 3.索引分类.基本语法 4.索引结构 5.哪些情况需要创建索引? 6.哪些情况不需要创建索引? ---------------- ...

  3. Mysql高级-应用优化,查询缓存优化,锁

    文章目录 1. 应用优化 1.1 使用连接池 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL复制分流查询 ...

  4. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)

    Linux + JVM + Mysql高级性能优化课程 课程名称:      Linux + JVM + Mysql高级性能优化 QQ群:      243242580(小白.菜鸟勿进)跟Java.M ...

  5. Python全栈(三)数据库优化之10.MySQL高级-表优化和索引优化

    文章目录 一.单表优化 二.双表优化 三.三表优化 四.索引优化 1.建表: 2.插入数据: 3.建立复合索引: 4.口诀: 全值匹配我最爱: 最左前缀要遵守: 带头大哥不能死: 中间兄弟不能断: 索 ...

  6. 《MySQL高级篇》八、索引优化与查询优化

    文章目录 1. 数据准备 2. 索引失效案例 2.1 全值匹配我最爱 2.2 最左匹配原则 2.3 主键插入顺序 2.4 计算.函数.类型转换(自动或手动)导致索引失效 2.5 范围条件右边的列索引失 ...

  7. MySQL高级- group by ,order by 索引优化

    一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...

  8. MySQL高级 - SQL优化 - 索引提示

    使用SQL提示 SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的. USE INDEX 在查询语句中表名的后面,添加 use index 来提 ...

  9. MySQL高级知识(六)——索引优化

    前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...

最新文章

  1. 输入重定向,输出重定向,管道相关内容及实现方法
  2. 汇编语言reg和sreg bp的介绍
  3. Android -- EventBus使用
  4. css的checkbox样式变化
  5. NutzWk 5.2.0 重磅发布,Java 微服务分布式开发框架
  6. scipy模块计算导数方法(central_diff_weights)
  7. 数学教师计算机能力提升,数学教师信息技术应用能力提升培训总结.doc
  8. Spring学习之AOP(面向切面编程)
  9. QT5开发及实例学习之十四Qt5排版功能
  10. CentOS 7.2下ELK分析Nginx日志生产实战(高清多图)
  11. 《剑指offer》面试题24——二叉搜索树的后序遍历序列(C++)
  12. idea android模拟器无法启动,Flutter Hello world应用程序无法在Android模拟器x86_64上启动...
  13. 翻译: 3.3. 线性回归的简明实现 pytorch
  14. 报表工具对比选型系列用例——排名及跨行组统计
  15. 计算机等级考试的资料,计算机等级考试(资料).pdf
  16. 什么是cc攻击以及个人网站遭到cc攻击的解决方法
  17. IDE、SATA、SCSI、SAS、iSCSI
  18. 6.WIN10 short cut
  19. 求助:tp-link wr720n路由器,想刷打印服务器!
  20. (java)Climbing Stairs

热门文章

  1. RAM与ROM的区别
  2. session机制详解
  3. c语言;文件名批量修改要求可以修改整个文件内文件名或后缀名自动,Python批量修改文件名...
  4. 如何打造团队的认同感
  5. 解决'python -m pip install --upgrade pip',显示“'python' 不是内部或外部命令,也不是可运行的程序”
  6. 【原创】从BZOJ2683 简单题中 整 CDQ分治解决三维偏序
  7. iOS开发者问题答疑——买号、关联、刷评论
  8. linux 添加快捷命令,linux 添加快捷指令
  9. CodeForces 85D Sum of Medians Splay | 线段树
  10. ASP.NET Core 技术内幕与项目实战读后感