mysql索引失效的情况(索引失效的情况和解决)

面试的时候被问到了:导致索引失效的原因有哪些?顿时哑口无言,平时不多注意,而支支吾吾的回答了几点,虽然问题不大,但是表达还是欠缺。今天在这里做一个总结,给自己长点记性。也可以当做是面试后总结的经验与笔记吧,保证下次不再犯错,同样在开发过程中能注意到这些问题。希望也能帮助到大家!

下面结合一些示例来给大家讲解

首先先新建临时表,这个表有四个字段 主键 、名字、年龄、职位

CREATE TABLE `sys_user` (
  `id` varchar(64) NOT NULL COMMENT '主键',
  `name` varchar(64) DEFAULT NULL COMMENT '名字',
  `age` int(64) DEFAULT NULL COMMENT '年龄',
  `pos` varchar(64) DEFAULT NULL COMMENT '职位',
  PRIMARY KEY (`id`),
  KEY `idx_sys_user_nameAgePos` (`name`,`age`,`pos`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

1.全值匹配

全值匹配意思就是联立的复合索引的顺序和个数要和检索的条件顺序和个数相同。

2.最佳左前缀法则(重要)
   最佳左前缀法则是指,如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列


下面我们给这个表建立一个复合索引

SELECT * FROM sys_user WHERE name='小明' AND age = 22 AND pos ='java';

以下是我们的检索语句:

SELECT * FROM sys_user WHERE name='小明' AND age = 22 AND pos ='java';

我们通过在检索语句前面加关键字 EXLAIN,可以知道是否使用的索引

(1)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age = 22 AND pos ='java';
(2)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age = 22 ;
(3)EXPLAIN SELECT * FROM sys_user WHERE name='小明'  AND pos ='java';

通过上面的结果我们可以知道,第一个复合索引的三个字段我们都用了,第二个复合索引我们只用到两个字段,第三个复合索引我们只用到一个字段。三个语句我们都用到索引,显然第一种是最优的。

我们再看看哪种情况会失效:

(4)EXPLAIN SELECT * FROM sys_user WHERE age = 22;
(5)EXPLAIN SELECT * FROM sys_user WHERE pos ='java';
(6)EXPLAIN SELECT * FROM sys_user WHERE age = 22 AND pos ='java';

以上三种情况都变成了全表扫描,原因是违反了最左左前缀原则,因为复合索引最左边的是name,当检索条件name没在前面索引将失效,第一种情况满足了全值匹配,第二种满足了两个字段name和age,第三种因为只满足了name,所以索引只用到name。

3.不在索引列上做任何操作(计算、函数(自动或手动)类型转换),会使索引失效转为全表扫描

(7)EXPLAIN SELECT * FROM sys_user WHERE  LEFT(name,1)='小明';

第七种情况失效是因为索引列做了计算或者函数的操作,导致了全表扫描。

4.存储引擎不能使用索引中范围条件右边的列
   可能大家关看上面的文字不知道是什么意思,下面我们执行一下查询语句就清楚了

(8)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age < 22 AND pos ='java';

从上图我们可以知道type变成了范围级别,也就是说age<22之后的pos字段的索引失效了。< p="">

5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致),减少select * 的使用
查询具体的字段比查询*效率更高,下面我们做一下对比

(9)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age =22 AND pos ='java';
(10)EXPLAIN SELECT name,age,pos FROM sys_user WHERE name='小明' AND age =22 AND pos ='java';

6.mysql在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描

(11)EXPLAIN SELECT * FROM sys_user WHERE name !='小明'

结果显示索引失效导致了全表扫描

7.is null,is not null 也无法使用索引

(12)EXPLAIN SELECT * FROM sys_user WHERE name is not null

8.like以通配符开头(’�c…’)mysql索引会失效变成全表扫描的操作,(%写右边则可以避免索引失效,如果业务实在需要’�c…%'则可以用覆盖索引避免索引失效)

(13)EXPLAIN SELECT * FROM sys_user WHERE name like '%明%'
(14)EXPLAIN SELECT * FROM sys_user WHERE name like '明%'
(15)EXPLAIN SELECT name,age,pos FROM sys_user WHERE name like '%明%'

从上面的结果,第一种索引失效,第二种只写右边的%则可以避免索引失效,第三种如果业务实在需要‘�c…%’这种sql,则可以用覆盖索引解决索引失效的问题

9.字符串不加单引号索引会失效

(16)EXPLAIN SELECT * FROM sys_user WHERE name=222;

因为检索字符串是必须加单引号,上面用用了222是int类型,mysql在检索的时候会判断name是varchar的类型会将222转换为’222’进行检索,索引列发生了类型转换,故索引失效。

10.少用or,用它连接时会索引失效

(17)EXPLAIN SELECT * FROM sys_user WHERE name='小明' or age = 22;

以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持php自学中心

(0)

相关推荐

  • 聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引) 操作方法 ...

  • mysql数据库中怎么创建索引。

    索引是由数据库表中一列或多列组合而成,其作用是提高对表中数据的查询速度. 索引是对数据库表一列或或多列的值进行排序的一种结构. 索引的创建: creta index test_suoying(索引的字 ...

  • 如何解决手机输入法失效键盘不弹出的情况

    手机输入法失效键盘不弹出怎么办,下面就跟大家分享想一下 操作方法 01 首先点击设置图标,在设置中找到更多设置,点击进入 02 点击语言和输入法,点击常用的输入法,进入输入法设置界面 03 然后我们进 ...

  • mysql update让字段加一时失效解决办法

    今天要用到update让某一字段进行加1的操作,结果居然不起作用,研究了好久终于找到了解决办法.做个笔记分享给大家 操作方法 01 先看一下我要执行加一的字段,partNum现在状态是null 02 ...

  • wallpaper engine重启失效、不能满屏显示的详细解决教程

    wallpaper engine是一款动态桌面壁纸,非常的酷炫,可以让你的桌面动起来还有特效和音效,但是也有玩家发现wallpaper engine不能满屏显示甚至使用的时候出现重启失效,下文小编就为 ...

  • ps索引怎么解锁?photoshop索引图片解锁方法图解

    小编一小伙伴在处理图片时发现导入到photoshop里面的图片使用文字工具就会颜色并且解锁不了,其实是因为图片模式是索引模式,只要改成CMYK或者RGB颜色模式就可以了解锁啦。具体操作方法如下: 图像 ...

  • Word2003如何标记索引项和生成索引

    word文档中的生成目录大家应该都不陌生,我们在大学做论文时就会用的生成目录.那今天小编要和大家分享的是标记索引以及生成索引,具体如何操作直接看下文. 操作方法 01 首先,我们打开word文档,找到 ...

  • 隐藏分区在普通情况下无法正常打开的解决方法

    我们一般碰到U盘都会有两个分区,其中的一个是隐藏分区,从而将重要文件安装在隐藏分区内,让无论是误操作,还是格式化,亦或者是感染病毒的时候,隐藏分区内的内容都安然无恙,不会影响数据的完整性。但是隐藏分区 ...

  • dota2启动器版本过低什么情况?dota2启动器版本过低解决方法

    dota2启动器版本过低解决方法来咯~有玩家反应登录DOTA2时提示“客户端版本过低”,怎么回事?该如何解决呢?希望下文的方法能够帮助大家解决问题。 法二、重启一次。 法二、退出dota2与STEAM ...

  • MYSQL索引失效的各种情形总结

    MYSQL索引失效的各种情形总结 操作方法 01 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 ...