MySQL高级

Posted 萌萌滴太阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL高级相关的知识,希望对你有一定的参考价值。

索引

索引概述

在这里插入图片描述

在这里插入图片描述

索引的优劣势

在这里插入图片描述

索引的结构

在这里插入图片描述
在这里插入图片描述

BTree结构

在这里插入图片描述

  • B+树是在B树基础上改造的,他的数据都在叶子节点,同时叶子节点还加了指针。
    在这里插入图片描述

  • 每个节点的key是升序排列

一个例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

B+Tree结构

在这里插入图片描述

在这里插入图片描述

  • 虽然B树的查找效率比B+高,但同B树相比,B+树的每一个节点少一个“指向数据的指针”,所以同样的内存大小【内存大小有限,若内存大小无限,则选用B树】,存储的B+树比B树多三分之一,存储的节点多,就能减少内外存之间的IO操作,提高效率;

mysql中的B+Tree结构

在这里插入图片描述

在这里插入图片描述

为什么MySql索引使用B+树

参考

  • 一般的树,一个节点可以有多个孩子,但一个节点只能存储一个元素,在元素非常多的时候,就使得要么树的度(节点拥有子树的个数的最大值)非常大,要么树的高度非常大,甚至两者都必须足够大才行。又因为索引是放在外存中的,查询这么庞大的树结构,使得IO操作(内存存取外存的次数)非常多,降低了性能;
  • 然后是B树(多路查找树),其一个节点可以存储多个元素,这样可以降低树的规模,从未降低了IO操作次数,提高了查找速度,改善了性能;【我们不用红黑树,因为红黑树子节点只有两个,做到了树的平衡,但树的规模还是没B树限制的好】
  • 但如果查询多条数据的话,B树需要做局部的中序遍历,由于B树的每个节点都存储数据,所以可能要跨层访问,这就意味着要在硬盘的页面之间进行多次访问【节点存储在不同的页面中】,降低了性能。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。

hash比B+查找时间更短,为什么索引不用hash?

  • 这和业务场景有关,如果只查找一个值的话,hash是一个很好的选择,但数据库经常会查多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了
    【同样查询n条数据,hash需查n次,即O(n) ;
    B+是O(log n):查询一次是O(log n),但查询一次后,由于B+树所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了,不在花费时间】。

  • 而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

索引分类

聚簇索引&非聚簇索引

所有的索引都属于这两类

在这里插入图片描述

在这里插入图片描述

  • 一张表只有主键索引是聚簇索引;因为主键自增,自动排序。
  • 对于聚簇索引,要找id=[1 , 6]之间的数,由于数据行和索引排序一致,找到id=1,6,然后去中间的数据即可,不用一行一行的找;而非聚簇索引,若想找一个范围内的数据,则需一个一个的查找。

具体索引分类

在这里插入图片描述

4)主键索引:某一个属性组能唯一标识一条记录;索引列的值必须唯一,且不能为null,主键索引只能有一个,唯一索引可能有多个
一个字段设置为主键后,数据库会自动为其建立主键索引

5)常规(普通)索引
快速定位特定数据

索引语法

创建索引

在这里插入图片描述

###查看索引
在这里插入图片描述

删除索引

在这里插入图片描述

alter(修改)命令

在这里插入图片描述

索引的设计原则

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

索引到底什么时候建----根据性能分析创建索引(Explain)

Explain是什么

在这里插入图片描述

Explain能干嘛

在这里插入图片描述

Explain怎么用

Explain + SQL语句

Explain结果各字段解释

视图

视图的概述

在这里插入图片描述

  • 视图是为了简化我们的查询操作。

创建或修改视图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看及删除视图

  • 查看
    在这里插入图片描述
  • 删除
    在这里插入图片描述

存储过程和存储函数【略】

存储过程和存储函数概述

在这里插入图片描述

触发器【略】

介绍

在这里插入图片描述

MySQL的体系结构

概述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

sql的执行流程

在这里插入图片描述

  • 客户端发送一个连接后,就要到mysql的连接池中获取一个连接,来执行对应的请求。获取连接时,还需进行一些:认证、连接最大数、缓存等;
  • 然后访问缓存和缓冲【缓存:读数据;缓冲:写数据】,若查询语句在缓存中命中,则不需要在接着执行了,直接将缓存里的对应数据返回出去;
  • 缓存中命中不了,再到SQL接口,再到解析器;
  • 再到优化器,它在不改变查询结果的条件下,调整sql的顺序,生成执行计划;
  • 存储器按照执行计划,对表进行操作,得到数据后,将结果返回客户端程序,同时向缓存里存一份。

存储引擎

存储引擎概述

在这里插入图片描述

各存储引擎

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

InnoDB和MyISAM区别

在这里插入图片描述

  • 行锁会发生死锁,表锁不会,因为表锁 锁的范围太大,不可能出现死锁。
    在这里插入图片描述

【在更。。。。。。。】

以上是关于MySQL高级的主要内容,如果未能解决你的问题,请参考以下文章

部分代码片段

linux中怎么查看mysql数据库版本

高级openg 混合,一个完整程序

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图