一、前提条件

1、创建三张测试表:

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id`int(11) NOT NULL,

`name` varchar(25) DEFAULT NULL,

`age`int(11) NOT NULL DEFAULT 0,

`update_time` datetime DEFAULT NULL,

`first_name` varchar(25) DEFAULT NULL,

`last_name` varchar(25) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `name`, `age`,`update_time` ,`first_name` ,`last_name`) VALUES (1,'张三',23,'2020-12-22 15:27:18','张','三'), (2,'李四',24,'2020-06-21 15:27:18','李','四'), (3,'王五',25,'2020-07-20 15:27:18','王','五');

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (

`id`int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `index_name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role` (`id`, `name`) VALUES (1,'产品经理'),(2,'技术经理'),(3,'项目总监');

DROP TABLE IF EXISTS `role_user`;

CREATE TABLE `role_user` (

`id`int(11) NOT NULL,

`role_id`int(11) NOT NULL,

`user_id`int(11) NOT NULL,

PRIMARY KEY (`id`),

KEY `index_role_user_id` (`role_id`,`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role_user` (`id`, `role_id`, `user_id`) VALUES (1,2,1),(2,1,2),(3,3,3);

2、创建对应的索引:

mysql>ALTER TABLE user ADD INDEX index_name (name);

Query OK,0 rows affected (0.03sec)

Records:0 Duplicates: 0 Warnings: 0

mysql>ALTER TABLE user ADD INDEX index_age (age);

Query OK,0 rows affected (0.02sec)

Records:0 Duplicates: 0 Warnings: 0

mysql>alter table user add index index_first_last_name (first_name,last_name);

Query OK,0 rows affected (0.12sec)

Records:0 Duplicates: 0 Warnings: 0

二、索引失效情况

最常说的like匹配;

强制类型转换会让索引失效;

最左匹配原则(组合索引按照建立的顺序,如果前一个匹配不上就会导致后一个命中失效);

WHERE 条件中使用or即使有索引也会失效;

1、最常说的like匹配

例1 explain select * from user where name like '%张';

例2 explain select * from user where name like '张%';

【结论:】例1索引失效 ,例2索引生效(匹配列前缀 '张%')

2. 强制类型转换会让索引失效

首先明确一点mysql优化器自动进行强制类型转换;也就是下面这两个sql都能查询到结果。

select * from user where name = '6';

select * from user where name = 6;

例1:explain select * from user where name = '6';

例2:explain select * from user where name = 6;

【 结论:】因为name在数据库的类型为:varchar,例2当mysql优化器自动进行强制类型转换时,索引失效;

3.最左匹配原则

例1: explain select * from user where first_name = '王' and last_name = '五';

例2: explain select * from user where last_name = '五' and first_name = '王';

例3 :explain select * from user where first_name = '王';

例4 :explain select * from user where last_name = '五';

【结论:】当建立一个组合索引时,根据例1和例2 得出 组合索引 where条件后面的排放顺序不会影响索引的命中;

根据例3 例4 得出如果组合索引中有部分字段缺失(因为建立索引的顺序是first_name ,last_name),按照建索引的顺序从左到右,依次匹配如果前一个                    列不匹配,则后一个列索引失效。

4. where条件中使用or即使有索引也会失效

例1:explain select * from user where name = '张三' or update_time = '2020-07-20 15:27:18';

例2:explain select * from user where update_time = '2020-07-20 15:27:18' or  name = '张三';

例3:explain select * from user where name = '张三' or age = 25;

【结论:】通过例1和例2可以得出如果条件中or的两边有一个没有建立索引就会导致索引失效;通过例3可以到,如果or两边字段都建立了索引,索引不会失效。

以上只是个人的一些简单总结 ,如果有什么问题希望指出,如果有什么问题可以一起讨论。

like左匹配索引失效_Mysql索引失效的情况相关推荐

  1. like左匹配索引失效_MySQL索引失效问题

    索引在我们使用MySQL数据库时可以极大的提高查询效率,然而,有时候因为使用上的一些瑕疵就会导致索引的失效,无法达到我们使用索引的预期效果,今天介绍几种MySQL中几种常见的索引失效的原因,可以在以后 ...

  2. 插入数据mysql索引失效_MySQL索引失效问题

    索引在我们使用MySQL数据库时可以极大的提高查询效率,然而,有时候因为使用上的一些瑕疵就会导致索引的失效,无法达到我们使用索引的预期效果,今天介绍几种MySQL中几种常见的索引失效的原因,可以在以后 ...

  3. mysql索引失效_MySQL索引失效的底层原理详解,终于有人讲清楚了

    前言 吊打面试官又来啦,今天我们讲讲MySQL索引为什么会失效,很多文章和培训机构的教程,都只会告诉你,在什么情况下索引会失效. 比如:没遵循最佳左前缀法则.范围查询的右边会失效.like查询用不到索 ...

  4. mysql数据索引失效_MySQL索引失效的几种情况

    1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...

  5. mysql 子查询索引失效_mysql 索引失效的情况

    索引失效的几种情况 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用 ...

  6. 主键需要键索引吗_MySQL 索引的知识点都在这里了,建议收藏!

    Java技术栈 www.javastack.cn 关注优质文章 数据库索引,相信大家都不陌生吧. 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.作为辅助查 ...

  7. mysql验证索引正确性_mysql索引测试

    生成测试数据: 创建表用于测试: /*创建t_user表用于数据测试*/ DROP TABLE IF EXISTS t_user; CREATE TABLE `t_user` ( `id` bigin ...

  8. mysql gis index 索引原理_Mysql 索引原理及优化

    Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...

  9. mysql多索引结构_MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

  10. mysql的索引优化_MySQL索引优化与分析(重要)

    建表SQL CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COM ...

最新文章

  1. Git将主合并到功能分支
  2. halcon初学者知识【16】如何将Image图象的区域拷贝出来?
  3. Android --- android.intent.action.MAIN 与 android.intent.category.LAUNCHER常用的几种情况
  4. Code Generate of Power Designer[转]
  5. RabbitMQ Header模式
  6. 腾讯汤道生:开源已成为许多技术驱动型产业重要的创新推动力
  7. 工作373-前端 import与export区别
  8. SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
  9. python数字排序 循环_【python-leetcode448-循环排序】找到所有数组中消失的数字
  10. 小米台灯底座接口很松_小米黑科技,AirPods和小米10 Pro伴侣,ZMI无线充蓝牙音箱体验...
  11. BZOJ【1609】 麻烦的聚餐
  12. java确定同一用户登录_java保持同一时间同一账号只能在一处登录
  13. ng bind html br,使用PrimeNG开发angular web项目
  14. 《第一桶金怎么赚——淘宝开店创业致富一册通》一一1.2 创业者应具备的条件与经验...
  15. 去除痘痘祛斑ps教程学习抠图ps婚纱照修图课程入门基础
  16. 计算机外文文献ssh,计算机外文文献及翻译(SSH).doc
  17. 数控弯管机xyz转换ybc的算法_数控弯管机技术的更新和应用.pdf
  18. 面对妖艳的配置文件,python小技巧来帮你!
  19. [架构]MVC/MCP/MVVM三个框架模式
  20. 社交软件红包技术解密(十):手Q客户端针对2020年春节红包的技术实践

热门文章

  1. cf600 E. Lomsat gelral
  2. Mod, Or and Everything HDU - 6950
  3. E. Colorings and Dominoes(未解决)
  4. 牛客题霸 [栈和排序] C++题解/答案
  5. [TJOI2011] 卡片(网络流 + 质因子优化建图)
  6. AT2667-[AGC017D]Game on Tree【SG函数】
  7. P1251-餐巾计划问题【费用流】
  8. P4149-[IOI2011]Race【点分治】
  9. [2020.10.25NOIP模拟赛]序列【Splay】
  10. P2480-[SDOI2010]古代猪文【中国剩余定理,Lucas定理】