MySql
2025-01-10 11:07:23 0 举报
AI智能生成
MySql
作者其他创作
大纲/内容
存储引擎
InnoDB
InnoDB 支持事务,行级锁
Innodb索引的底层B+树特点:叶子节点存储数据
非叶子节点存储索引,同时,叶子节点是以有序链表相互连接
非叶子节点存储索引,同时,叶子节点是以有序链表相互连接
InnoDB 中 B+ 树的数据结构中存储的都是实际的数据,这种索引有被称为 聚集索引。
MyISAM
不支持事务
表级锁
B+ 树实际数据的地址值,它的索引和实际数据是分开的,索引指向了实际数据。非聚集索引。
事务
基于redo log(重做日志)保证数据的持久性和原子性
基于undo log(回滚事务)保证事务的一致性
基于undo log(回滚事务)保证事务的一致性
A原子性
C一致性
底层原理:undo log
底层原理:undo log
1.记录修改过的数据
2.为每条数据增加一个事务id与回滚指针,回滚指针用来指向前一个版本的数据
3.每次update或delete都会在undo log中产生一条新的数据,形成层了版本链
4.事务回滚后,会根据回滚指针找到数据所在的位置,并将数据恢复到原来
I 隔离性
底层原理:锁
D持久性
Redolog
Sql 调优
排查慢sql
找出慢查询 开启 MySQL 查询日志
show variables like "%slow_query%"
确认索引 通过 EXPLAIN 命令
优化查询语句
优化数据表结构
调整 MySQL 配置
MVCC
undo log回滚日志
Read-View
读已提交
读取规则
可重复读
读取规则
Snapshot
MySQL的隔离级别
隔离级别
读未提交
产生脏读
读已提交oracel默认
避免了脏读
可重复复{Inodb 默认}
避免了脏读,可重复读,以及部分幻读
串行化
隔离级别最高,脏读,可重复读,幻读全都避免,影响性能
锁
悲观锁
是指再操作数据时,先加锁,然后进行数据操作,
直至事务提交或回滚时才释放锁,
悲观锁的实现方式一般是使用SELECT ... FOR UPDATE或者 SELECT ... LOCK IN SHARE MODE进行锁定,
保证操作期间数据不被其他事务修改。
直至事务提交或回滚时才释放锁,
悲观锁的实现方式一般是使用SELECT ... FOR UPDATE或者 SELECT ... LOCK IN SHARE MODE进行锁定,
保证操作期间数据不被其他事务修改。
乐观锁
是指在操作数据时,先不加锁,而是先进行数据操作,
然后再更新数据时判断是否被其他事务修改过,
如果没有则提交更新,否则回滚操作。
乐观锁的实现方式一般是使用版本号或时间戳等方式进行比较
然后再更新数据时判断是否被其他事务修改过,
如果没有则提交更新,否则回滚操作。
乐观锁的实现方式一般是使用版本号或时间戳等方式进行比较
共享锁和排他锁之间存在冲突,
即一个事务持有共享锁时,
其他事务无法获取排他锁,反之亦然
即一个事务持有共享锁时,
其他事务无法获取排他锁,反之亦然
排他锁
行级排他锁 SELECT ... FOR UPDATE
表级排他锁 LOCK TABLES
自增锁 MySQL会使用自增锁来保证每个事务获得唯一的自增值。
全局排他锁 整个数据库实例进行加锁 备份和恢复
共享锁
行级共享锁 SELECT ... LOCK IN SHARE MODE
表级共享锁 LOCK TABLES ... READ
Innodb 的行锁是加在索引(主键索引)上的 是给索引在加锁 并不是给单独的行记录在加锁 如果过滤条件中没有索引的话 使用的是表锁 而不是行锁
行级锁
记录锁 行级别
可以是共享锁或排他锁
Next-Key Lock
记录锁和间隙锁(Gap Lock)结合起来
间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,
InnoDb会给符合条件的已有数据的索引加锁,对于在条件范围内,但却不存在的数据叫做间隙,
InnoDB也会为这个间隙加锁,这种锁机制就是间隙锁。
InnoDb会给符合条件的已有数据的索引加锁,对于在条件范围内,但却不存在的数据叫做间隙,
InnoDB也会为这个间隙加锁,这种锁机制就是间隙锁。
表级锁
索引
索引无效
联合索引没有遵循最左原则 - a,b,c -> where c =1 and b= 5 and a = 6
相当于把column_name所有数据都转换
索引列进行了类型的强制转换或者类型不匹配
索引列加了函数或表达式 UPPER(column_name) = 'VALUE'
索引列进行了计算
对索引列使用了NOT操作:如果在查询条件中对索引列使用了NOT操作,
MySQL无法使用索引,需要进行全表扫描。
MySQL无法使用索引,需要进行全表扫描。
如果查询条件中包含索引列为NULL的情况,
MySQL无法使用索引,需要进行全表扫描。
MySQL无法使用索引,需要进行全表扫描。
索引列的值太长:如果索引列的值太长,
超过了索引的限制,MySQL无法使用索引。
超过了索引的限制,MySQL无法使用索引。
创建索引
创建表时指定索引字段
在已创建的表上添加索引
索引的加载流程
innodb
二级索引/辅助索引树
非聚集索引
当where条件是普通索引时时,B+树叶子节点上面存储的是对应的主键,然后再通过主键去查询整行的数据
主键与数据不存在一块
一级索引
聚集索引
当where条件是主键索引时,主键对应的整行的数据
主键与数据存储再一块的
自适应哈希索引(相当于一种优化) 把二级索引值放到内存
MyISAM
存储引擎的data存储的是数据地址,他的主键索引与非主键索引存储的都是一样的,没有区别
哈希索引
内存的存储引擎
没办法处理磁盘上的数据,加载到内存上构建高效的搜索数据结构,因为它没有办法减少磁盘I/O的次数
只适合做等值搜索,其他的范围、排序等不适合,因为哈希表中的元素没有任何顺序可言,所以要正表搜索
mysql执行流程
- 建立连接
- 走分析器,分析sql语法是否正确,判断内存中是否有数据,有则直接返回
- 缓存中没有数据,走优化器,优化器会判断选择索引(假如有多个where条件,会优先选择索引字段执行)
- 到执行引擎执行sql,返回结果
- 存储引擎-InnoDB/MyISAM
- 进入持久层-undo log、redo log
- 存入磁盘
存储 存储在硬盘上
存储结构
页
InnoDB的数据基本存储单位是页,大小通常是16KB,
每个页可以存储一行或多行数据,索引和数据都存储在页中
每个页可以存储一行或多行数据,索引和数据都存储在页中
区
B+树中每一层的页都会形成一个双向链表,
虽然相邻的页但是物理位置可能很远,随机I/O就很慢。
一个区就是物理位置上的连续的64个页1m 双向列表中记录的实际地址
虽然相邻的页但是物理位置可能很远,随机I/O就很慢。
一个区就是物理位置上的连续的64个页1m 双向列表中记录的实际地址
段
每个段中有32个碎片页,段中的空间首先要保存在32页中,
超出容量的在以分区的方式申请空间,段的这种页和区混合管理的方式
单位是区 多个表多个页 就几行 会不够一个区
超出容量的在以分区的方式申请空间,段的这种页和区混合管理的方式
单位是区 多个表多个页 就几行 会不够一个区
表空间
InnoDB存储引擎结构的最高层,所有数据都放在表空间中,单位是段
表都被存储在一个或多个文件中,每个表都有一个.frm文件
每个表还有一个.ibd文件,它存储着表的数据和索引。
0 条评论
下一页