MySQL进阶(索引)

MySQL进阶

一、存储引擎

索引是在存储引擎中实现的,所以不同的存储引擎有不同的索引结构

MySQL5.5版本后默认存储引擎是innoDB

什么是存储引擎

image-20220223141900646

image-20220223142138009

显示所有的存储引擎

image-20220223142156744

指定存储引擎 engine = ?

image-20220223143424090

存储引擎特点

innoDB特点:

image-20220223144136707

  1. 事物
  2. 外键
  3. 行级锁

image-20220223144328771

逻辑存储结构:

  1. 表空间

myisam存储引擎

image-20220223144546531

memory存储引擎

image-20220223144642691

区别

image-20220223144701350

存储引擎的选择

image-20220223145244065

二、索引

什么是索引:一种高效获取数据的数据结构

image-20220223151027708

索引的优缺点

image-20220223151005527

索引的结构

image-20220223151348500

一般我们使用或者谈到的都是B+Tree索引

1.二叉树

image-20220223151618748

我们使用二叉树进行存储的时候,如果顺序插入数据那么就会形成一个链表,性能会降低,这时候我们就使用红黑树来存储

2.B树

image-20220223152148826

使用b树image-20220223152214332

3.B+树

使用b+树

image-20220223152507986

MySQL的b+树

image-20220223152622358

4.hash索引

hash索引

image-20220223152916721

image-20220223152940179

面试题:为什么使用B+树

树的数据结构中我们遍历的树的深度越深查询效率越慢,二叉树在顺序插入的时候会形成链表性能低,红黑树也是二叉树层数也比B+树更深,B树中叶子节点和非叶子节点都会存储数据,这样也会导致层数加深,而hash索引不支持范围查询和排序

image-20220223153351767

索引的分类

image-20220223154830223

image-20220223154806180

image-20220223154737167

问题

image-20220223155634521

索引的语法

image-20220223160413075

SQL性能分析

1.执行频率

image-20220223160741703

在我们的客户端上使用show global status like ‘Com____________________’

获取全局的状态信息,模糊查询Com后面7个字符的信息,我们可以通过这个获取数据库当前查询多还是增删改多

2.慢查询日志

image-20220223161704221

3.profile

image-20220223162225862

image-20220223162203033

4.explain

image-20220223162805396

可以使用类型判断语句的效率,也就是type属性

image-20220223163937284

image-20220223164131155

索引效率检测

image-20220223164915537

最左前缀法则

联合查询中:最左侧列的索引存在后续才存在,否则失效

image-20220223191022763

image-20220223191412276

索引的失效

1.索引列运算

image-20220223191710168

2.字符串不加引号

image-20220223191836931

3.头部模糊查询

image-20220223192013708

4.or连接

image-20220223192214501

这里是否走索引取决于查询的效率是否不如全表扫描,如果走索引不如全表扫描那么MySQL评估就不会走索引

NULL 和 NOT NULL 也是一样的,如果当前查询数据NULL 非常多,那么就可能走全表扫描而不走索引,NOT NULL同理

5.评估决策

image-20220223192557676

SQL提示(指定索引)

image-20220223193520739

覆盖索引(回表查询)

image-20220223194348358

理解:如果我们当前查询的数据存在索引之中,那么我们先走二级索引必然可以直接返回当前需要的数据,因为二级索引本身就包含id和本身的数据。

但是如果我们查询的数据没有索引的话,那么我们必须要走聚集索引通过id才能查到我们对应的数据

image-20220223194605459

解决办法:最好的方法是建立username和password的联合索引,这样当我们查询数据的时候直接通过二级索引就可以返回结果,但如果我们只对username创建索引的话,那么我们必然需要连表查询,这样增大时间的花费

前缀索引

image-20220223195619145

联合索引

image-20220223200142141

索引设计原则

image-20220223200446927

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者



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

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

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

打赏作者

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

抵扣说明:

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

余额充值