Mysql高手养成——第一章:索引知识,浅尝性能分析

Mysql高手养成:第一章——索引与性能优化,
本文介绍了Mysql数据库的基础知识,包括InnoDB存储引擎的特点,以及索引的类型、优点和缺点。重点讲解了如何选择合适的存储引擎,索引的创建、查看与删除,以及SQL性能分析方法,如慢查询日志和执行计划分析。

📣 📣 📣 📢📢📢
我是小冷 侧重后端的全栈工程师,有关技术问题需要讨论交流的直接私信即可
当前专栏mysql高手养成系列- 第一章 索引与浅尝性能分析
✏️高质量技术专栏专栏链接: 微服务数据结构netty单点登录SSMSpringCloudAlibaba

Mysql高手养成——第一章:索引知识,浅尝性能分析

前言
和很多高级开发前辈交流的时候,多数人认为数据库是新人工程师经验获取最多的技术,他们认为数据库经验是能决定一个程序员的下限的。
所以相对扎实的数据库基础加上生产环境多变的需求 将 历练自己成为一个数据库高玩,在技术提升的道路上 保证下限提升上线是最稳妥的做法。
于是乎 新的专栏开始了 和小冷来一起稳固自己的楼盘 为之后万丈高楼平地起打下殷实基础
参考资料 :
黑马 mysql:https://www.bilibili.com/video/BV1Kr4y1i7ru
冰河大佬的 《mysql技术大全》
《高性能MySQL(第3版)》

存储引擎

我们在使用mysql的时候 就可以发现 在5.5之后 创建表的默认结构语句会带上engine = innodb 这个是默认的存储引擎。

innodb

是兼顾高性能和高可靠性的通用存储引擎

特点:

  • DML操作,遵循ACID模型 ,支持事务,行级锁,主外键约束
  • innodb引擎的每张表都有对应的表空间文件 存储表结构 (frm,sdi),数据和索引

image-20221229173605919

MYSQL三种引擎的对比

image-20221229173647914

我们如何去决定需要什么引擎呢?

  • innodb 是默认存储引擎如果在并发的情况下对数据一致性有要求,除了查询和插入之外还有很多更新和删除的操作,那么可以优先选择innodb
  • MyISAM 如果是以读和插入操作为主,更新和删除操作少,且对事务和并发的要求不是很高,那么可以选择这个引擎
  • MEMORY:将所有的数据保存在内存中,访问速度快,通常用于临时表的缓存,对表的大小有限制,且无法保证数据安全性

索引

索引(index)是帮助MySQL 的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

图解

image-20221229174104660

优点:

提高检索效率,降低数据库IO成本,通过索引可以对数据进行排序,降低排序成本减少cpu资源的消耗

缺点:

索引也是占用空间的,索引大大提高了查询效率,但是降低了更新表的速度,对表的增删改效率会变低

存储引擎支持的索引类型

image-20221229174306854

B+ Tree(多路平衡查找树)

image-20221229174420567

为什么innodb要使用b+树来作为索引结构

  • 相比于二叉树层级少,效率更高
  • 对于b树 无论是叶子结点还是非叶子节点都会存储数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  • 相对hash索引 b+树允许排位匹配且天然支持排序

Hash结构

才用hash算法将键和值转换成心的hash值 映射到对应的位置存在hash表中,如果两个或者多个映射到同一个位置,就会产生hash冲突,可以通过链表来解决

特点

  • hash索引只能对等比较,不支持范围查询
  • 无法利用索引完成排序操作
  • 查询效率高

image-20221229174515195

索引分类

image-20221229174919568

在innodb中 索引的存储形式,可以分为以下两种

  • 聚集索引(Clustered Index):将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,必须有且只有一个
  • 二级索引(Secondary Index):将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键,可以存在多个

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

image-20221229175115213

如果我们需要查找一个人 比如 arm

image-20221229175148534

  • 先查询二级索引 拿到arm的id值
  • 返回去查找聚集索引下的表数据
  • 回显,这个过程我们成为回表查询

索引语法

创建索引

create index index_name on table_name(index_col_name)

查看索引

show index from table_name

删除索引

drop index index_name on table_name

SQL性能分析

查看sql频次

show global status like 'com%'

可以查看sql的执行次数,来根据结果分析数据库进行优化

慢查询日志

在sql中 慢查询日志是默认不开启的 我们需要自己设置,如果需要可以去修改mysql的配置文件,当有sql执行耗时超过我们设置的时间,我们就会在慢查询日志定位到这些sql

image-20221230134243869

profile

show profiles 可以在sql优化的时候让我们了解时间的消耗都在那里。通过 have_profiling参数,可以看到mysql当前支不支持profile操作

select @@have_profiling

默认的profiling 是关闭的 我们需要通过设置来开启

set profiling = 1

查看一系列业务sql操作的耗时情况

查看耗时基本情况
show PROFILE

查看指定queryid的sql语句各个阶段的耗时情况
show  profile for query query_id

查看指定query_id的sql cpu 使用情况
show profile cpu for query query_id

explain sql执行计划分析

image-20221230135519112

id 查询序列号,用来表示多表查询的时候操作表的顺序 (id相同执行顺序从上到下 id 不同值越大越先执行)

如果有用到子查询 就会出现 id 不同的情况 优先执行子查询的sql

最左前缀原则

他主要对于联合索引有约束,最左前缀是查询从索引的最左列开始,并且不跳过索引中的列,否则索引会失效

我们假设有数据表设置了一个三个字段的联合索引:

  • profession
  • age
  • status

image-20221230141105472

从下图执行的两个sql我们可以发现 如果去掉后面的条件,依然会走索引查询,但是不可以跳过中间字段

我们可以这么查 1 2 3 
也可以 1 2 
但是不可以 1 3 
也不可以 2 3
最左前缀法则 必须包含最左边的列 否则不会走索引 ,也不可以跳过列 否则索引会失效

索引失效情况

  1. 不要再索引列上进行函数运算 否则会导致索引失效
  2. 字符串类型没有加引号 索引也会失效
  3. 用模糊查询的时候 如果是尾部模糊那么索引不会失效 但是头部模糊会失效(如果是数字类型 模糊就会失效)
  4. 用or 分开的条件,一侧有索引一侧没有索引会导致索引失效,如两侧都用有索引 那么会生效
  5. 数据分布的情况 如果mysql评估索引比全表慢,那么就不会使用索引
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值