MySQL索引及优化技巧,什么是Redis缓存雪崩、缓存穿透和缓存击穿

执行计划具体来说就是一条sql语句的执行过程

可以看到执行过程中用到了哪些关键的信息,并根据这些信息做判断

1.3、如何使用执行计划?


就是在sql语句前面加上关键字==explain==,在sql语句前面加上explain之后,它会输出n多个列

explain:美 [ɪkˈspleɪn] 解释;说明;阐明;说明(…的)原因;解释(…的)理由

1.4、案例


1)数据表

testnd5

在这里插入图片描述

2)执行计划

explain SELECT * FROM testnd5

3)执行结果

在这里插入图片描述

4)结果分析

  • id

当sql语句非常复杂的时候,会有一个id序号的排列,根据序号的排列能显示出来哪个子查询或者子句优先执行,哪个字句后执行,仅此而已,有时候需要看,有时候不需要看,它不是一个关键信息

  • select_type

查询的类型(简单查询、联合查询、子查询),一般没什么用

  • table

sql语句执行的表的名称

  • type

很重要,表示查询对应的类型,mysql默认的是ALL

有这几种

  • system
  • const
  • ref
  • range
  • index
  • all

从前往后,效率依次降低,即system的效率是最高的,all要进行全表扫描,效率低,所以我们最少要保证type在range这个级别(通过加索引、调整当前子句…),达到ref更好但是某些情况是没法优化的,优化知识为了在一定程度上解决问题,并不是一定有解。可以优化但并不是优化完一定有效果

官方文档地址

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_type

在这里插入图片描述

在这里插入图片描述

有的sql语句非常简单,sql语句越简单,优化的程度就越低

  • possible_keys

可能用到的索引

把可能用到的索引都列出来,意义不大

  • key

很重要,表示当前的sql语句中到底有没有用到索引,这个值尽量不要为空

  • rows

过滤的行数,只是预估值,不是精确值

  • Extra

比较重要,表示额外的信息

当出现的是using index:表示使用了索引覆盖

using index condition表示使用了索引下推

using filesort表示使用了临时空间进行排序,没有使用索引进行排序

2、索引介绍

================================================================

2.1、什么是索引?


  • 索引是数据结构,可以高效地获取数据
  • 索引存储在文件系统中
  • 索引的文件存储形式与存储引擎有关
  • 索引文件结构
*   hash
*   二叉树
*   B树
*   **B+树** (MySql索引文件结构)

2.2、索引分类


  • 主键索引

主键是一种唯一性索引,它必须指定为PRIMARY KEY,不能为空每个表只能有一个主键

一个主键并非一定只有一个列,也可以是多个列组成的联合主键

MySql会自动为主键创建索引

  • 唯一索引

索引列的所有值都只能出现一次,即必须唯一,值可以为空一张表可以在不同的字段建多个唯一索引

  • 普通索引

基本的索引类型,值可以为空,没有唯一性的限制

  • 全文索引

全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建

  • 组合索引

多列值组成一个索引,专门用于组合搜索

又称:复合索引、联合索引

3、索引 增删查改

===================================================================

3.1、增加(创建)


  • ALTER TABLE

推荐

适用于表创建完毕之后再添加

alter [ˈɔːltər] 修改、更改

ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index) [索引名](字段名)

– 索引名,可要可不要;如果不要,当前的索引名就是该字段名

ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

ALTER TABLE table_name ADD FULLTEXT KEY (column_list)

  • CREATE INDEX

适用于表创建完毕之后再添加

CREATE INDEX 可对表 增加 普通索引UNIQUE索引

– 只能添加 普通索引 或 UNIQUE索引

CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)

  • 建表时添加

不推荐

CREATE TABLE test1 (

id smallint(5) UNSIGNED AUTO_INCREMENT NOT NULL, – 注意,下面创建了主键索引,这里就不用创建了

username varchar(64) NOT NULL COMMENT ‘用户名’,

nickname varchar(50) NOT NULL COMMENT ‘昵称/姓名’,

intro text,

PRIMARY KEY (id),

UNIQUE KEY unique1 (username), – 索引名称,可要可不要,不要就是和列名一样

KEY index1 (nickname),

FULLTEXT KEY intro (intro)

) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘后台用户表’;

3.2、删除


DROP INDEX index_name ON talbe_name

ALTER TABLE table_name DROP INDEX index_name

– 这两句都是等价的,都是删除掉 table_name 中的索引 index_name

ALTER TABLE table_name DROP PRIMARY KEY – 删除主键索引,注意主键索引只能用这种方式删除

3.3、查看


show index from table_name;

3.4、更改


删掉重建一个既可

3.5、创建索引的技巧


  • 维度高的列创建索引

  • 数据列中不重复值出现的个数,这个数量越高,维度就越高

  • 如数据表中存在8行数据a,b,c,d,a,b,c,d这个表的维度为4

  • 要为维度高的列创建索引,如性别和年龄,那年龄的维度就高于性别

  • 性别这样的列不适合创建索引,因为维度过低

  • 对 where,on,group by,order by 中出现的列使用索引

  • 对较小的数据列使用索引,这样会使索引文件更小,同时内存中也可以装载更多的索引键

  • 为较长的字符串使用前缀索引

  • 不要过多创建索引,除了增加额外的磁盘空间外,对于DML(数据库管理语言,如增、删、改)操作的速度影响很大,因为其每增删改一次就得重新建立索引

  • 使用组合索引,可以减少文件索引大小,在使用时速度要优于多个单列索引

  • 更新频繁,数据区分度不高的字段,不宜建立索引

4、存储引擎

================================================================

MyIsam、InnoDB、Memory

Memory 底层数据结构为哈希表

| 比较 | MYISAM | INNODB==(默认)== |

| — | — | — |

| 索引类型 | 非聚簇索引

数据和索引不在一起存储 (只存地址) | 聚簇索引

数据和索引在一起存储 |

| 事务 | 不支持 | 支持 |

| 数据表锁定 | 支持 | 支持 |

| 数据行锁定 | 不支持 | 支持 |

| 外键约束 | 不支持 | 支持 |

| 全文检索 | 支持 | 支持(5.6及以后) |

| 所占空间 | 小 | 大,约2倍 |

| 底层数据结构 | B + 树 | B + 树 |

| 适合操作类型 | 大量select | 大量insert、delete、update |

  • 聚簇索引
*   数据跟索引存储在一起
  • 非聚簇索引
*   数据跟索引不存储在一起

5、索引 技术点

==================================================================

在这里插入图片描述

索引系统设计要点

1)索引应该存哪些信息


2)索引和数据存储位置


对于InnoDB

索引和实际的数据都是存储在磁盘上的,只不过在进行数据读取的时候会优先把索引加载到内存中

存储引擎:不同的数据文件在磁盘中有不同的组织形式

  • MyIsam存储引擎

.frm 表结构

.MYD 数据文件

.MYI 索引

在这里插入图片描述

  • InnoDb存储引擎

.frm 表结构

.ibd 索引文件+数据文件

在这里插入图片描述

3)索引存储什么格式的数据?


K-V格式(键-值对)

类似于查字典,根据页数定位要查找的内容

4)选择合理的数据结构进行存储


为什么是B+数(为什么不是B树或者hash表)

当表非常大的时候,索引会不会一起变大?

因为往表里存数据的时候,是没法判断这个表能够存多少数据的,表中数据量在增大的时候,索引也在增大

索引在变大的过程中,没办法直接加载到内存怎么办?

可能内存只有8G,但是mysql数据的索引达到了16G,则可以分块读取,1G 1G地读,分而治之

尽可能多地提高IO效率

1:减少IO量

2:减少IO次数

在这里插入图片描述

6、操作系统基础知识

====================================================================

6.1、局部性原理


  • 时间局部性

之前被访问过的数据很有可能再次被访问

  • 空间局部性

数据和程序都有聚集成群的倾向

6.2、磁盘预读


内存跟磁盘在进行交互的时候有一个最小的逻辑单位,这个单位称之为页,或者datapage,一般是4kb或者8kb,由操作系统决定,我们在进行数据读取的时候,一般是读取页的整数倍,也就是4k,8k,16k;Innodb存储引擎在进行数据读取的时候读取的是16kb的数据

举例:如下图,我们可以看到,实际的文件大小是758字节,但是占用了4kb的大小(可以把磁盘看成一个一个的小格子,每一个格子都是4kb的大小,不管你有没有占满,都是4kb)

在这里插入图片描述

7、MySql 为什么选择B+树?

===========================================================================

7.1、hash表


缺点:

  • hash存储需要将所有的数据文件添加到内存,浪费内存空间
  • 如果是等值查询,hash很快;但实际工作中范围(range)查找的更多,而不是等值查询,所以hash就不合适了
  • 哈希索引

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,也是对索引列计算一个散列值(类似md5、sha1、crc32),然后对这个散列值以顺序(默认升序)排列,同时记录该散列值对应数据表中某行的指针,当然这只是简略模拟图

在这里插入图片描述

比如对姓名列建立hash索引,生成hash值按顺序排列,但是顺序排列的hash值并不对应表中记录,从地址指针可反应出来,而且,hash索引可能建立在两列或者更多列上,取得是多列数据后的hash值,它不存储表中数据。它先计算列数据的hash值,与索引中的hash值比较,找到了然后比对列数据是否相等,可能涉及其他列条件,然后返回数据。hash当然会有冲突,即碰撞,除非有很多冲突,一般hash索引效率很高,否则hash维护成本较高,因此哈希索引通常用在选择性较高的列上面。哈希索引的结构决定了它的特点:

1. hash索引只是hash值顺序排列,跟表数据没有关系,无法应用于order by

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。

架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

image

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-tnsGA4tv-1712176456826)]

总结

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。

架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

[外链图片转存中…(img-VlXq8NH5-1712176456827)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值