mysql面试题
局部性原理
取数据会多取一些数据出来放到内存中,通常为一页,一页4kb大小。
mysql两种存储引擎对比
innodb数据页结构
innodb页单位,16kb

innodb聚集索引

如果没有定义主键,那么innodb会判断有没有唯一索引,如果存在唯一索引,那么就会把这个唯一索引当作主键,如果连唯一索引都没有,就会自动生成一个字段(row_id),自增ID。
row_id是一个隐藏列,只有在select语句时才会被查询出来。
b+树:
叶子结点:只存数据
非叶子结点:存主键+指针
innodb采用的是聚集索引,索引和数据是在同一份文件存储。
create index idx_t1_bcd on t1(b, c, d);
b,c,d为辅助索引,通过对比各索引上的数据的大小进行排序。
先比b的大小,b相等再比c,c相等再比d,以此类推。得到排序后的“序号”,和该序号对应的主键索引的值,最后通过回表查询,获取主键索引对应的真实的数据。

辅助索引,叶子结点存储数据和主键索引的值,再通过回表查询,查询主键索引查找真实的数据
通过查询辅助索引查出来主键索引的个数占主键索引总数的80%以上,走全表查询
正常utf8是0到4个字节大小
mysql utf8是0到3个字节大小,有些字符是不支持的,mysql中的utf8mb4是标准的utf8编码格式
最左前缀原则
b,c,d是索引
1,*,*,走索引,1**肯定比644小
*,1,*,不走索引,因为无法判断*1*和644哪个大哪个小
# 不走索引
select b from t1 group by b,c,d
# 走索引,相当于还是最左前缀原则
select b from t1 where b=1 group by b,c,d
事务
ACID
原子性
隔离性
一致性
完整性
mysql事务中有autocommit属性
隐式提交
update之后,没有commit,再执行create,alter等ddl操作,会隐式的commit
mysql事务保存点
四种隔离级别:
-
读未提交:一个事务可以读到其他事务还未提交的数据,脏读(不可重复读)。
用得不多,不严谨,违背事务的特性。
-
读已提交:一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据修改并进行提交后,该事务都能查询到最新的值,会出现不可重复读,幻读。
read commit级别,一个事务加了写锁时,其他事务可以对已加锁的事务所查出来的数据做插入操作。
前一个事务提交数据之后,第二个事务读取到最新的值,前一个事务再次更新数据,第二个事务读取到的值发生改变,好像是出现了幻觉。
-
可重复读(mysql默认的隔离级别)
一个事务第一次读取过某条记录之后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录后,读到的数据依然还是第一次读取的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复读,但是还是会出现幻读。
repeatable read加写锁时,其他事务不能对已查出来的数据进行插入操作。
-
串行化
一个事务在修改某些数据的时候,其他事务操作该数据会出现阻塞,必须等修改数据的事务提交之后才能操作。用得很少。
版本链
对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们 创建的表中有主键或者非NULL唯一键时都不会包含row_id列):
- trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。
- roll_pointer:每次对某条记录进行改动时,这个隐藏列会存一个指针,可以通过这个指针找到该记 录修改前的信息。(版本,最新的版本会指向之前的一个版本)

readview
m_ids:已修改还未提交的事务,会保存其id至m_ids内,

可重复读是即使其他事务修改并提交了数据,但是m_ids依然保持不变,仍然认为这些是活跃的事务id。
MVCC(多并发版本控制)
MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、 REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程。可以使不同 事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级 别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会 生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查 询操作都重复使用这个ReadView就好了
间隙加锁
repeatable read加写锁时,其他事务不能对已查出来的相关数据进行插入操作。