MySQL进阶(索引)

MySQL进阶

一、存储引擎

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

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

什么是存储引擎

image-20220223141900646

image-20220223142138009

显示所有的存储引擎

MySQL进阶(索引)_第1张图片

指定存储引擎 engine = ?

MySQL进阶(索引)_第2张图片

存储引擎特点

innoDB特点:

MySQL进阶(索引)_第3张图片

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

MySQL进阶(索引)_第4张图片

逻辑存储结构:

  1. 表空间

myisam存储引擎

MySQL进阶(索引)_第5张图片

memory存储引擎

MySQL进阶(索引)_第6张图片

区别

MySQL进阶(索引)_第7张图片

存储引擎的选择

MySQL进阶(索引)_第8张图片

二、索引

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

image-20220223151027708

索引的优缺点

MySQL进阶(索引)_第9张图片

索引的结构

MySQL进阶(索引)_第10张图片

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

1.二叉树

MySQL进阶(索引)_第11张图片

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

2.B树

MySQL进阶(索引)_第12张图片

使用b树MySQL进阶(索引)_第13张图片

3.B+树

使用b+树

MySQL进阶(索引)_第14张图片

MySQL的b+树

MySQL进阶(索引)_第15张图片

4.hash索引

hash索引

MySQL进阶(索引)_第16张图片

MySQL进阶(索引)_第17张图片

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

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

MySQL进阶(索引)_第18张图片

索引的分类

MySQL进阶(索引)_第19张图片

MySQL进阶(索引)_第20张图片

MySQL进阶(索引)_第21张图片

问题

MySQL进阶(索引)_第22张图片

索引的语法

MySQL进阶(索引)_第23张图片

SQL性能分析

1.执行频率

MySQL进阶(索引)_第24张图片

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

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

2.慢查询日志

MySQL进阶(索引)_第25张图片

3.profile

MySQL进阶(索引)_第26张图片

MySQL进阶(索引)_第27张图片

4.explain

MySQL进阶(索引)_第28张图片

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

MySQL进阶(索引)_第29张图片

MySQL进阶(索引)_第30张图片

索引效率检测

MySQL进阶(索引)_第31张图片

最左前缀法则

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

MySQL进阶(索引)_第32张图片

MySQL进阶(索引)_第33张图片

索引的失效

1.索引列运算

MySQL进阶(索引)_第34张图片

2.字符串不加引号

MySQL进阶(索引)_第35张图片

3.头部模糊查询

MySQL进阶(索引)_第36张图片

4.or连接

MySQL进阶(索引)_第37张图片

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

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

5.评估决策

MySQL进阶(索引)_第38张图片

SQL提示(指定索引)

MySQL进阶(索引)_第39张图片

覆盖索引(回表查询)

MySQL进阶(索引)_第40张图片

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

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

MySQL进阶(索引)_第41张图片

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

前缀索引

MySQL进阶(索引)_第42张图片

联合索引

MySQL进阶(索引)_第43张图片

索引设计原则

MySQL进阶(索引)_第44张图片

你可能感兴趣的:(MySQL,笔记,mysql,数据库,database)