- InnoDB 引擎和 MyISAM 引擎索引差异
- 聚集索引和非聚集索引的区别
- 幻读是如何被解决的
- update 语句的执行过程
- 如何优化 order by 语句
- B+ 树的特点
- MVCC 实现原理
- select 语句的执行过程
- 如何优化 count(*) 查询
- join 语句原理分析
本课程从 MySQL 索引的存储结构开始入手,逐步分析了 MySQL 如何选择索引,索引的优化措施;分析了 MySQL 事务原理,MVCC 原理,锁的实现等一系列面试中高频面试题相关知识点原理。
数据库作为一名开发者必须掌握的知识,而 MySQL
作为一款优秀的开源数据库,也越来越受欢迎。本课程将不在将着重介绍一些面试中经常被提及的知识点进行深入分析,一步步掌握 MySQL
底层原理。从 MySQL
索引为什么要选择 B+
树存储,到深入分析索引的实现原理和优化措施;从事务基本概念介绍到深入分析 MVCC
实现原理;从全局锁到行锁,从记录锁到间隙锁一步步深入揭开 MySQL
中锁的奥秘;从 select
语句和 update
语句的执行流程到深入分析 count(*)
语句,order by
语句,join
语句等实现原理,并对如何优化提出了思路,通过本课程,让你更深入的了解到 MySQL
的奥秘。
MySQL中的索引: 1.B树索引 (1)普通索引 CREATE INDEX index_name ON table_name (column_name);
(2)唯一索引 CREATE UNIQUE INDEX index_name ON table_name (column_name);
(3)前缀索引 CREATE INDEX index_name ON table_name (column_name(10));
(4)多列索引 CREATE INDEX index_name ON table_name (column_name1, column_name2);
2.哈希索引:在InnoDB引擎中不支持创建 3.全文索引:5.7版本后支持
MySQL中的索引: 1.B树索引: (1)普通索引: (2)唯一索引: 2.哈希索引:在InnoDB引擎中不支持创建 3.全文索引:5.7版本才支持
InnoDB 每张表都有且只有一个聚集索引
其实如果我们没有显示的指定主键,InnoDB 会选择一个非空的唯一索引列作为主键,如果我们也没有创建非空的唯一索引,那么 InnoDB 就会选择其自己内置的一个 6 字节长的 ROWID 自增列作为主键。
除了主键索引之外的其他索引都是非聚集索引(Secondary Indexes) 非聚集索引的叶子节点存储的是当前索引的键值和主键索引的键值。
回表指的就是非聚集索引从叶子节点拿到数据(主键的键值)之后,还需要再根据主键键值去扫描主键索引的 B+ 树,这种操作就叫做回表。
回表操作需要扫描两颗 B+ 树,这也就是为什么在 InnoDB 中主键索引的效率相比较其他索引是最高的,因为主键索引只需要扫描一棵 B+ 树。
一个查询只需要查询当前索引的值和主键的值,而不需要查其他数据,这时候就不需要回表了,直接就可以返回,这种也称之为覆盖索引。
select执行过程: 1、建立半双工连接 2、查缓存 3、语法语义检查 4、优化器选择执行计划 5、根据执行计划调用引擎api执行 6、返回结果
行锁:锁索引,没有索引锁表。 行锁算法:记录锁:命中时;间隙锁:未命中时;临键锁:左开右闭,innodb默认算法。
全局锁 表锁:LOCK:读锁只能读不能写,写锁读写都阻塞;MDL:mysql自动加,增删改查读锁,改变表结构写锁,读写互斥。 行锁:行共享锁s锁,行排他锁x锁。 意向锁:意向共享锁IS,意向排他锁IX。
事务的隔离级别: 未提交读:能读到别人改完回滚的假数据,脏读; 读已提交:能读到别人改完提交的数据,不可重复读; 可重复读:任何时候读到的都是一样的,幻读; 串行化:事务串行。 事务隔离方案: LBCC:基于锁的并发控制,事务上锁,效率低; MVCC:多版本并发控制,每个数据更改后生成快照,之后读取快照。
事务ACID:A原子性;C一致性;I隔离性;D持久性; 事务分类:扁平事务,带保存点的扁平事务,链事务,嵌套事务,分布式事务;
1、MySQL选择索引:通过参数Cardinality。通过实际开销决定选择什么索引,而不是某种规则。可以强制使用哪种索引但不推荐。 2、索引失效情况: 最左匹配原则:like第一个字符不确定时失效;多列联合索引只单独查询中间或后面索引失效; 在索引列上使用函数的话索引失效; 字符串不加引号默认调用to_char()函数索引失效; !、not in 等反向查询时索引失效。 但都有特例存在,因为mysql根据开销选择索引而非某规则。
1、索引数据类型:B树、哈希、全文索引; 2、B树索引分类:普通索引、唯一索引、前缀索引、多列联合索引; 3、索引优化方案: 索引下推(ICP):将server层的条件计算下推到引擎; 多范围读(MRR):减少随机访问IO,变成顺序访问; 索引合并:多列都单独有索引时,mysql能分辨索引,分别查询,将结果合并。用到这个也说明索引建立的很糟糕。
MyISAM索引:索引树和数据树分开; InnoDB索引:叶子节点存数据; 聚集索引(主键索引):叶子节点存数据本身; 非聚集索引:叶子节点存当前索引的键值和主键id,如需其他数据,回表查询聚集索引树; 覆盖索引:非聚集索引只查主键或当前索引键值(无需回表)。
索引节点信息; 各种数据结构不能做索引的原因; InnoDB用B+树实现索引; B+树比B树的优势;
关系型数据库和非关系数据库; MySQL的逻辑架构; MySQL常用引擎:InnoDB、MyISAM、Memory
慢慢来,不理解的地方欢迎发提问帖哦~
这章过于抽象了,10分满分,我也就理解了2分