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高级的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段