mysql知识总结(重点1)

269 阅读4分钟

1.mysql架构图

2.mysql存储引擎比较:

MyISAMInnoDB
最小粒度行表锁表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作
是否支持事务NY
是否支持外键NY
select count(*)效率慢(全表扫描)

3.索引类型:

聚集索引,非聚集索引

主键索引(聚集索引),普通索引,联合索引,唯一索引

B+树的数据结构(多路平衡查询树):减少访问磁盘的次数,尽量让固定大小的磁盘放下尽可能多的索引数据,单个索引越小越好(所以放弃了b-树),把真实的数据都放在叶子结点,也利于范围查询,索引的最左匹配原则也和此数据结构有关

一颗b+树一般存储2千万级别的索引:

InnoDB的存储单元是页 16k = 16384字节

假设一行真实数据大小为1k,叶子结点(一页)可以存储16行数据,

非叶子结点(一页)存储索引,假设索引为bigint类型,也就是8字节,加上指针大小是6字节,16384/(14)= 1000

则一颗2层高的树可以存储 161000=1.6w条数据 一棵三层高的树可以存储 161000*1000 = 1600w条数据

4.创建索引的情况:

哪些情况需要创建索引

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 单键/组合索引的选择问题,高并发下倾向创建组合索引
  5. 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
  6. 查询中统计或分组字段

哪些情况不要创建索引

  1. 表记录太少
  2. 经常增删改的表
  3. 数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
  4. 频繁更新的字段不适合创建索引(会加重IO负担)
  5. where条件里用不到的字段不创建索引

5.覆盖索引,回表

6.隔离级别

三个现象:脏读,不可重复读,幻读

四个隔离级别:读未提交,读已提交,可重复读,串行化

事务的四大特性:ACID,原子性,一致性,隔离性,持久性

原子性:undolog来保证,记录逻辑操作记录,要么同时成功,有一个失败则根据undolog全部回滚 隔离性:mysql有四种隔离级别,mysql自己加锁来实现(mvcc) 持久性:redolog来保证,记录物理操作,mysql突然挂了,也可以通过日志来进行恢复 一致性:通过前面3个特性来保证,事务最终的目的

6.1mysql日志

binlog:mysql的主从复制利用了 bin log的特性,bin log还用于mysql数据恢复,属于逻辑日志(逻辑日志:记录更新的sql语句,物理日志:)

undolog:主要记录了数据的逻辑变化,记录可以反向恢复的逻辑sql,属于引擎层,innodb

redolog:物理日志,在事务提交时,只记录修改的数据页(因为日志文件相对更小并且在物理层上是连续的),归属于innodb存储引擎

重点理解

二阶段提交:

1.redolog的prepare

2.biglog的写入

3.redolog的commit

先写入日志,再落磁盘是保证mysql速度的关键

7.mysql的锁

行锁,表锁

读锁,写锁

8.mvcc介绍

背景:在保证一致性的前提下,做到读写并行,提高读写性能 原理:在每行数据有两列隐藏的字段,分别是数据最后更改的版本idDB_TRX_ID(记录着当前ID)以及 指向上一个版本数据的指针DB_ROLL_PTR,每次开启事务都会有一个唯一全局自增的事务id

读已提交和可重复读可以通过比较数据版本号码,来实现隔离级别

幻读:可以通过当前读来解决(注意幻读的概念定义)

快照读:每次读之前都去获取当前活跃着的事务的事务号合集 当前读:只会在事务开启前去获取当前活跃着的事务的事务号合集

9.mysql中的锁

10.分库分表