- MYSQL存储引擎介绍
MyISAM和InnoDB的区别
MYISAM是5.5之前默认的存储引擎,支持全文索引,压缩,空间函数,但是不支持事务和行级锁,最大却显示崩溃后无法安全恢复。
对比:
1.是否支持行级锁:MyISAM只有表级锁,InnoDB支持表级锁和行级锁,默认是行级锁
2.是否支持事务和崩溃后的安全恢复:MyISAM强调性能,每次查询具有原子性,执行速度更快,但是不提供事务支持,InnoDB支持外键和事务等高级数据库功能,支持回滚,崩溃后的修复,和事务
3.是否支持外键:MyISAM就不支持,InnoDB支持
4.是否支持MVCC:仅InnoDB支持,MVCC用于高并发事务,比加锁更加高效,MVCC只在READ COMMITTED 和 REEPEATABLE READ两个隔离级别下工作,内部使用乐观锁和悲观锁来实现
https://www.cnblogs.com/songwp/p/14338422.html
(在InnoDB使用聚簇索引或者访问数据放入内存的应用中,执行效率比MyISAM更快)
————————————————
版权声明:本文为CSDN博主「盖世英雄来了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40513633/article/details/111146180
- 索引
mysql索引使用的数据结构主要有BTree索引和哈希索引,哈希索引底层数据结构是哈希表,对于单条记录查询的时候可以选择哈希索引,查询性能最快,其余场景,更适合使用B-Tree索引
mysq中使用的是B+Tree索引,但是对于MyISAM和InnoDB实现的方式不同

为什么要使用B+树呢?
首先我们知道在数据库中索引可以使用hash算法,查询效率很高,但是不支持范围查询,因此我们考虑使用平衡二叉树,但是我们知道二叉树每个节点只有一个数据,如果数据变多的话,树就会越来越高,查询的成本也会增高,我们考虑使用B树,它可以在一个节点存储多个数据,B+树的优化是非叶子节点的数据会冗余一份在叶子节点,并且叶子节点之间使用指针相连,因此增高查询效率,而且支持范围查询,B+树里的元素也是有序的
————————————————
版权声明:本文为CSDN博主「盖世英雄来了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40513633/article/details/111146180
https://www.cnblogs.com/songwp/p/14338422.html
https://www.51cto.com/article/685312.html
- InnoDB 索引实现——聚集
表数据文件本身就是按 B+Tree 组织的一个索引结构文件
聚集索引-叶子节点包含了完整的数据记录
为什么 InnoDb 表必须有主键,并且推荐使用整型的自增主键?
如果没有设置索引的话,MySQL 会选择一个数据唯一的列作为主键索引, 如果找不这样的列。会去做创建一个隐藏列类似 rowid。
表数据文件按照 B+Tree 的数据结构维护,在叶子节点维护的是该行的数据。所以必须有主键。
整型更方便 B+Tree 排序,自增的话,对于数据结构的存放更快, 顺序存放,不需要进行大量树的平衡操作。
为什么非主键索引结构叶子节点的存储的是主键值?
一致性, 让主键索引先成功,然后再去更新非主键索引关系
节省存储空间。
主键索引示意图:

image.png
非主键索引示意图:

image.png
两个数据文件:
.frm 主要是存储表结构信息
.ibd 主要是存储索引和数据
- MyISAM 索引文件——非聚集
索引文件和数据文件是分离的(非聚集)

image.png
三个数据文件:
.frm 数据结构文件
.myd 文件主要是存储数据
.myi 文件主要是存储索引信息
- mysql 执行过程
连接器:建立连接、验证账号密码、检查权限
缓存(8.0失效)
分析器:词和语法的检查
优化器:选择最佳索引、生产执行计划
执行器: 通过API ,调用引起

https://www.cnblogs.com/wyq178/p/11576065.html
https://blog.csdn.net/xhaimail/article/details/135287338
- mysql 语句解析过程
from
join on
where
group by
having
select
distinct
order by
limit

https://www.cnblogs.com/williamjie/p/11081592.html
- mysql explain详解
在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)
https://cloud.tencent.com/developer/article/1093229