Mysql笔记@TOC
总结一些关于面试中涉及到的MySQL的知识点
最近年底在找工作,总结了一些mysql常会问到的知识点和原理,总结一下以便于今后在工作求职中提供参考
Mysql常用的三种存储引擎
- Innodb
Innodb是Mysql事务性数据库引擎,在日常工作中应用比较频繁,事务安全,支持回滚;不支持全文搜索,需要占用更大的空间维护数据与索引。 - MyIsam
MyLsam不支持事务,特点是访问速度快,对事务完整性没有要求的情况下可使用。 - Merge
Merge本身不存储数据,通过定义一组数据类型完全相同的Mylsqm表,来进行数据的操作。对Merge表的操作实际上是对多个MyIsam表的小组进行操作,常用于分表查询。
Innodb
Innodb的特点是是并发高,读取快;本身提供了细粒度行锁,较其他引擎,Innodb对并发访问处理的能力更强;采用B+树存储索引,减少了频繁的IO访问量,使索引的查找更快。
一. Innodb常用的锁(当前默认事务隔离级别为可重复度):
有如下一张表info
|id|name |sex|
|1 |张三 |男 |
|2 |李四 |男 |
|4 |王五 |男 |
|6 |赵六 |男 |
- 记录锁
select * from info where id = 1 for update;
当执行完这条查询之后,mysql会锁住id=1的这一行数据,直到这条事务结束之前,其他事务无法在对id=1这条数据进行修改,删除操作。 - 间隙锁
select * from info where id between 4 and 7;
执行完这条操作,mysql会锁住id在4-10之间的所有所有数据,临间锁的目的是防止当查询id在4-7操作执行的过程中,其他事务执行了一条id=7和id=5的插入操作,导致查询出来的数据只包含id=4和6的两条数据,而数据库中却存在着id=7和id=5的幻影数据。其主要目的就是防止不可重复度的情况发生,如果数据库事务隔离级别下降为读提交,那么间隙锁会自动失效。 - 临间锁
临间锁是记录锁与间隙锁的结合技能锁住指定id的行,又能锁住行区间的数据,方知幻读情况产生。
PK上潜在的临键锁为:
(-infinity, 1]
(2, 4]
(4, 6]
(6, +infinity]
mysql Innodb引擎还有其他4种锁,自增锁(锁表),共享锁,排他锁,意向锁,后续会进行更新
二. Innodb的索引:
Innodb的索引分为两类,聚合索引和辅助索引:
- 聚合索引
每一个主键上的索引即是一个聚合索引,若没有主键Innodb会选取第一个非空且唯一的字段建立聚合索引。聚合索引以B+树的结构进行存储,每一个叶子结点上包含着索引值与该条数据的行记录数据。在每次执行查询时,mysql并不能根据索引查询到行数据 - 辅助索引
在一个表中可以存在多个辅助索引,其存储结构与聚合索引相同,均是B+树,不同之处是在于,辅助索引的叶子结点上包含的是加索引字段的值与一个标签,这个标签记录着改行记录聚合索引的key,索引根据辅助索引查询一行全量数据时,其实是进行了两次索引查询,第一次查询辅助索引,获得集合索引的值,之后根据这个值去集合索引进行查询,查找到叶子结点上的数据,并返回。 - 联合索引
联合索引是根据多条索引进行查询,遵循最左前缀规则。对where,order by,group by 都生效 - 覆盖索引
指从辅助索引中就能获取到需要的记录,而不需要查找聚簇索引中的记录。使用覆盖索引的一个好处是因为辅助索引不包括一条记录的整行信息,所以数据量较聚集索引要少,可以减少大量io操作。
三. Innodb支持的索引结构:
B树索引:特点是树高一般设置为2-4,所以每次进行索引查询的次数不超过4次,结合当下硬件访问磁盘的时间约为0.01秒,所以一次查询会不超过0.04秒。
哈希索引:无法人为干涉,innodb自适应。
集群索引
MyIsam
支持全文索引
全文索引具体操作
https://blog.csdn.net/qq_38377190/article/details/80873621