MySQL进阶-索引(三)

目录

验证索引效率

 针对字段创建索引

通过explain语句查询执行状况

 最左前缀法则

概述

符合最左前缀法则情况

不符合最左前缀法则情况

范围查询

索引列运算

测试索引生效情况

测试查询phone尾数两位为15的数据

字符串不加引号

模糊查询

测试查找profession为软件工程的用户

or连接的条件

首先查看测试表的索引:

测试查找id为10或者年龄为23的用户

测试创建索引后是否符合条件

数据分布影响

测试查找phone>='1779990000'的数据


验证索引效率

在未建立索引之前,执行如下SQL语句,查看SQL的耗时

 

我们只需要关注执行的效率,返回1条数据,耗时20.78sec

 针对字段创建索引

 然后再执行相同的SQL语句,再次查看SQL的耗时

 构建索引耗时1min11.20sec,为一千万条数据构建B+树(默认)

此时耗时0.00sec (后面还有数字0.00******)

通过explain语句查询执行状况

 最左前缀法则

概述

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

如果跳跃某一列,索引将部分失效(后面的字段索引失效)

案例:

准备一张tb_user表:

查看其索引

show index from tb_user

 其中包含了一个主键索引(primary),两个单列索引(phone,name)和一个联合索引(profession,age,status)

其中联合索引的序号1,2,3分别对应profession,age,status

符合最左前缀法则情况

使用explain查看索引使用情况

 可以看出使用了联合索引,并且索引的长度(key_len=54),符合最左前缀法则

这两个查询语句也符合最左前缀法则,可以推测出status的索引长度为5(54-49),name的索引长度为2(49-47)。

符合最左前缀法则,索引长度为54,虽然profession在最后面,但是只要存在, 就符合

不符合最左前缀法则情况

这两条语句不符合最左前缀法则,因为不包含最左边的变量profession! 

这条语句也不符合最左前缀法则,跳过了中间的参数age,虽然用了联合索引,但是后面的status的索引失效 

范围查询

联合索引中,出现范围查询(>,<),范围右侧的列索引失效

 此时不符合最左前缀法则,key_len长度为49,status的索引失效

此时符合最左前缀法则,age使用>=,status的索引生效

通常在业务允许的情况下,最好使用>=,<= 

索引列运算

不要再索引列上进行运算操作,索引将失效

数据准备:

 可以看出在phone字段上建立了单列索引

测试索引生效情况

 此时通过explain可以看出索引生效

测试查询phone尾数两位为15的数据

 此时索引失效,因为在查询语句中使用了函数运算

字符串不加引号

字符串类型字段使用时,不加引号,索引将失效

 不加引号可以查询出来结果,但是没有使用索引

模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

测试查找profession为软件工程的用户

尾部模糊匹配:

 头部模糊匹配:

前后模糊匹配:

  可以看出尾部模糊匹配索引生效,而头部模糊匹配索引失效,前后都模糊匹配也失效!

or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

首先查看测试表的索引:

测试查找id为10或者年龄为23的用户

 其中id有主键索引,而age只有联合索引,如果不符合最左前缀法则的话,age不会被用到,

索引不符合or连接的条件,因此两个索引都没被用到

测试创建索引后是否符合条件

create index idx_user_age on tb_user(age);

此时索引生效 

数据分布影响

如果MySQL评估使用索引比全表更慢,则不适用索引

 查询profession为空的时候使用了索引,而is not null的时候并未使用索引,因为profession不存在null值,绝大多数数据都满足条件,因此MySQL评估全表扫描比使用索引更快,因此不使用索引,而is null为极少数数值,所以MySQL评估使用索引更快,因此使用索引

测试查找phone>='1779990000'的数据

可以看出phone>='1779990000'和phone>='1779990010'时,MySQL评估后仍使用全表扫描,因为表中的大部分数据都满足查找条件,phone>='1779990013'时,使用索引,因为大部分数据不满足条件,MySQL评估使用索引会更快

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课程设计】 课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 索引、有些不索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。
MySQL 进阶实战》是一本探讨MySQL数据库高级应用和实战技巧的书籍。MySQL是一种广泛使用的开源关系型数据库管理系统,在Web开发和数据分析等领域有着重要的应用。 《MySQL 进阶实战》将帮助读者理解MySQL的高级功能和最佳实践,进一步优化数据库的性能和稳定性。本书主要内容包括: 1. 高级查询优化:介绍如何使用索引、列存储和分区技术来提高查询性能,避免慢查询和死锁等问题。 2. 数据库设计与架构:详细讲解如何设计合理的数据库模型,包括表关系、数据类型和字段命名规范,以及应对高并发和大数据量的应用场景。 3. 高可用与备份恢复:介绍如何设置主从复制、集群和故障切换,确保数据库的高可用性和数据安全。 4. 性能调优与监控:介绍如何使用工具和技术调优MySQL数据库的性能,包括查询优化、缓存设置和资源管理等方面。 5. 安全与权限管理:详细讲解如何设置数据库的用户权限、访问控制和加密保护,防止非法访问和数据泄露。 6. MySQL新特性与实践:介绍新版本MySQL的特性和改进,以及如何应用到实际项目中。 《MySQL 进阶实战》不仅适合已经具有一定MySQL基础知识的读者,也可以作为MySQL数据库开发和运维人员的参考手册。通过读此书,读者将能够更深入地了解和应用MySQL数据库,在实际项目中提高开发和管理效率,提升数据库的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值