CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`code` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
`age` int DEFAULT '0',
`name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,
`height` int DEFAULT '0',
`address` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_code_age_name` (`code`,`age`,`name`), -- 建立 idx_code_age_name 索引
KEY `idx_height` (`height`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
 INSERT INTO sue.user (id, code, age, name, height,address) VALUES (1, '101', 21, '周星驰', 175,'香港');
-- INSERT INTO sue.user (id, code, age, name, height,address) VALUES (2, '102', 18, '周杰伦', 173,'台湾');
INSERT INTO sue.user (id, code, age, name, height,address) VALUES (3, '203', 23, '苏三', 174,'成都');
select version() as 'mysql版本号';

--  where 后面是主键,使用了主键索引
explain select * from user where id = 1; -- 这5条sql中都有code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。
explain select * from user where code = '101';
explain select * from user where code = '101' and name = '周星驰'
explain select * from user where code = '101' and age = 21
explain select * from user where code = '101' and age = 21 and name = '周星驰'
explain select * from user where code = '101' and address = '香港' -- 不满足最左匹配原则,没有包含给定字段最左边的索引字段,即字段code。
explain select * from user where age =21
explain select * from user where name = '周星驰'
explain select * from user where age = 21 and name = '周星驰' -- 使用select *查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。
explain select * from user where name = '周星驰'
-- select语句中的查询列,都是索引列,那么这些列被称为覆盖索引,查询的相关字段都能走索引.
explain select code,name from user where name = '周星驰'
explain select id,code,name from user where name = '周星驰' -- id字段的主键索引,在有计算的情况下失效。id+1=2-->id = 2
explain select * from user where id+1=3 -- height 走普通索引
explain select * from user where height = 173
-- 在使用该函数 SUBSTR() 之后,走全表扫描,索引失效
explain select * from user where SUBSTR(height,1,3) = 173 -- 走联合索引 idx_code_age_name ,查询字符字段时,用双引号"和单引号'都可以。
explain select * from user where code = "101"
-- code字段的类型是varchar,而传参的类型是int,两种类型不同,索引失效。
explain select * from user where code = 101
-- 走普通索引:idx_height。int类型的参数,不管在查询时加没加引号,都能走索引。
explain select * from user where height = '175'
-- 如果是int类型字段作为查询条件时,它会自动将该字段的传参进行隐式转换,把字符串转换成int类型。
select 1+'1' -- 执行结果是2 -- 想拼接字符串该怎么办?使用concat关键字。
select concat(1,'1') -- 执行结果是 11 -- 查出所有code是10开头的用户:%在参数右边时走索引
explain select * from user where code like '10%'
-- 查出所有code是1结尾的用户:%在1左边,code字段索引失效
explain select * from user where code like '%1'
-- 查出所有code包含1结尾的用户:当like语句中的%,出现在查询条件的左边时,索引会失效。
select * from user where code like '%1%' -- 如果把两个单独建了索引的列,用来做列对比时索引会失效
explain select * from user where id = height
-- myisam:如果使用了or关键字,那么它前面和后面的字段都要加索引,不然所有的索引都会失效。
-- innodb:在myisam的基础上:数据量少不走索引,数据量大的前提下,比如100条数据查出符合条件的数据为少量,即:10条左右走索引,查出的数据为多量,即:70条左右则不走索引
-- 结论:or、in 通常是走索引的,当in后面的数据在数据表中超过30%(匹配数据大约6000/16000 = 37.5%)的匹配时,会走全表扫描,即不走索引,因此in走不走索引和后面的数据有关系。
explain select * from user where id = 2 or height= '173';
-- 走索引,结论如上
explain select * from user
where height in (173,174,175,176);
-- 内层走索引,外层结论如上
explain select * from user t1
where exists (select 1 from user t2 where t2.height=173 and t1.id=t2.id)
-- 而普通索引字段使用了not in关键字查询数据范围,索引会失效。结论如上
explain select * from user
where height not in (173,174,175,176);
-- 主键字段中使用not in关键字查询数据范围,任然可以走索引。
explain select * from user
where id not in (173,174,175,176);
-- t1不走索引,t2走索引
explain select * from user t1
where not exists (select 1 from user t2 where t2.height=173 and t1.id=t2.id)

mysql 数据库索引在什么场景下会失效?实战篇的更多相关文章

  1. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  2. 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询

    MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...

  3. 谈谈MySQL数据库索引

    在分析MySQL数据库索引之前,很多小伙伴对数据结构中的树理解不够深刻.因此我们由浅入深一步步探讨树的演进过程,再一步步引出MySQL数据库索引底层数据结构. 一.二叉树 二叉查找树也称为有序二叉查找 ...

  4. MySQL数据库索引的4大类型以及相关的索引创建

    以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...

  5. (转)MySql数据库索引原理(总结性)

    本文引用文章如链接: http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100 参考书籍:Mysql技术内幕 本文主要是阐述 ...

  6. 知识点:Mysql 数据库索引优化实战(4)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...

  7. MySQL数据库索引之B+树

    一.B+树是什么 B+ 树是一种树型数据结构,通常用于数据库和操作系统的文件系统中.B+ 树的特点是能够保持数据稳定有序,其插入与修改操作拥有较稳定的对数时间复杂度.B+ 树元素自底向上插入,这与二叉 ...

  8. MYSQL数据库索引类型及使用

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  9. MySQL数据库索引常见问题

    笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...

  10. MySQL数据库在WINDOWS系统CMD下的编码问题

    MySQL数据库在WINDOWS系统CMD下的编码问题 1. 查看MySQL数据库编码 * SHOW VARIABLES LIKE 'char%'; 2. 编码解释 * character_set_c ...

随机推荐

  1. 大白话讲讲 Go 语言的 sync.Map(一)

    阅读本文大约需要 4.25 分钟. 程序是枯燥乏味的. 在讲 sync.Map 之前,我们先说说什么是 map(映射). 我们每个人都有身份证号码,如果我需要从身份证号码查到对应的姓名,用 map 存 ...

  2. 如何在 Windows Server 2022 阿里云服务器上搭建自己的 MQTT 服务器之二Mosquitto服务器

    一.介绍 最近几天都在搭建MQTT服务器,几天前搭建好了一个 Apache-Apollo的 MQTT 服务器,当我们在管理我们的主题的时候,发现主题的名称的斜杠(/)变成了点号(.),正好我在调试程序 ...

  3. Ubuntu Ctrl + Alt + [F1~F6] 图形化终端与命令行终端

    在20.04的版本中,F1和F2是两个图形化终端,可以登陆不同的用户.(如果是相同的用户登陆,则进入的是同一个终端.) F4-F6都是命令行终端,即便使用相同的用户登陆,也是打开不同的终端. 说明,命 ...

  4. Magick.NET跨平台压缩图片的用法

    //首先NuGet安装:Magick.NET.Core,Magick.NET-Q16-AnyCPUusing ImageMagick; /// <summary> /// 压缩图片 /// ...

  5. 一个超经典 WinForm 卡死问题的最后一次反思

    一:背景 1. 讲故事 在我分析的 200+ dump 中,同样会遵循着 28原则,总有那些经典问题总是反复的出现,有很多的朋友就是看了这篇 一个超经典 WinForm 卡死问题的再反思 找到我,说 ...

  6. Win11和Win10怎么禁用驱动程序强制签名? 关闭Windows系统驱动强制签名的技巧?

    前言 什么是驱动程序签名? 驱动程序签名又叫做驱动程序的数字签名,它是由微软的Windows硬件设备质量实验室完成的.硬件开发商将自己的硬件设备和相应的驱动程序交给该实验室,由实验室对其进行测试,测试 ...

  7. Strategy Pattern and Polymorphism —— Behavioral Class

    策略模式着重于封装和替换 不同的算法或行为,以便在运行时进行选择. Simple example - Computer and USB interface 现代人对计算机.USB接口还有各种设备之间的 ...

  8. redhat7 team bonding 双网卡绑定 主备 负载均衡

    team简介 team也被称为网络组,是将多个网卡聚合在一起,从而实现冗错和提高吞吐量.适用于redhat7.0以上版本,至多可支持8块网卡.team相对于之前的bonding技术,能提供更好的性能和 ...

  9. KRPANO资源分析工具模板链接下载

    KRPano资源分析工具1.4.0加入了模板链接下载,可以批量下载有规律的链接. 模板链接基本规则 数字递增链接 pic[1-100]:会生成pic1,pic2,-pic100的链接 pic[a-z] ...

  10. Burp Suite抓包工具配置代理手机抓取数据包

    工作中很多手机上的问题因为环境差异导致无法在pc设备上完整的模拟真实物理手机,因此需要方法能抓取到手机设备上所有数据包发送详情.发现了这个好用的数据包抓取工具Burp Suite. 一.配置流程: 1 ...