mysql
2024-07-05 21:26:16 19 举报
AI智能生成
登录查看完整内容
mysql
作者其他创作
大纲/内容
针对数据统计有额外的数据存储 故而针对count(*)效率更高
mysiam和innoDB区别
row日志格式 清楚记录每一行数据被修改的情况 不会导致由于函数比如now()导致的时间不一致问题, 缺点批量操作会产生大量的日志
基于sqlserver
mixd日志格式以上两种模式的混合使用
二进制日志,基本记录所有数据的修改,主要主从同步
binlog
基于innodb的
顺序io redolog就2个文件 如果满了,checkpoint如果没有持久化的就赶紧持久化
记录数据修改后的记录顺序记录保证数据的持久性,记录的是数据页的变化物理变化是事务级别的操作方式
mysql做了二阶段提交保证数据一致
redolog
undolog
mysql的几种日志
当事务提交时先把 redolog写到操作系统的缓存区,并不会对redolog持久化,这种情况如果数据挂了,操作系统并没有挂,那么事务的持久新还是可以保证的
如果在写入redolog(prepare)时崩溃 此时是满足数据一致性的此时拿着事务id去binlog中去找没有找到则回滚,如果在binlog中找到则设置redolog为commit提交数据
开始事务更新数据写入redolog(prepare阶段)提交事务写入binlog和设置redoglog为commit标志
mysql二阶段提交
1.客户端与服务端进行连接
2 查询缓存,查询到数据则返回记录(mysql 8.0已经删除)
3查询不到则解析器进行词法分析和语法分析生成语法树
4 预处理器进行校验表名和字段名
6 执行器则调用api来到存储引擎来检索相应的数据
mysql的执行流程
LRU链表
对于有修改的加到脏页加到flush链表中mysql需要持久化就从flush链表中找到持久化到磁盘
flush链表
什么是bufferpool
分库
主要是解决数据量大的问题,如果你的单表数据量比较大,,因为并发度不高那么数据连接可能还够,但是存储和查询遇到性能遇到瓶颈,需要分表
分表
把一张表的记录放到不同表中这就是横向拆分
横向拆分(水平拆分)
把一张表的多个字段拆分到多张表中则是纵向拆分
纵向拆分(垂直拆分)
为什么需要分库分表
分片规则分片逻辑 在内存中性能更高
jdbc应用层分片
shardingsphere
jdbc直连层的
优点是跨语言
分片规则和分片逻辑跨进程的
mycat
proxy代理层的
分库分表开源框架
mysql分库分表
注意关联字段使用索引
查询字段使用索引 不要select * 不然内存装不下
小表驱动大表
联表查询的优化点
where子句在group by分组和聚合函数之前对数据进行过滤
having子句在 group by分组和聚合函数之后进行数据过滤
对于内连接 where子句和on 后面and条件查询一致
对于外连接 where是对连接后过滤 而on后面and条件还是返回全部左表 只对右表限制没有置为null
mysql中数据存放在磁盘中是以数据页存储的一页默认大小为16kb
mysql数据如何在磁盘存储
原子性
持久性
隔离性
一致性
mysql中四大特性
聚簇索引
普通索引
联合索引
唯一索引
mysql中索引的分类
查询的列在一颗索引树上就可以获取 无须进行回表操作
什么是索引覆盖
当使用非主键索引进行查询时,我们查询的列不在索引树上时,,根据索引树上查询到的主键值去主键索引树上获取完整的数据
什么是回表
什么是索引下推
select选择字段不能包含非索引字段
sql中不能带group by 和distinct语法
仅仅支持单表查询不支持多表查询
mysql8.0引入的优化,某种程度上可以无视最左前缀原则,,不过限制条件如下
什么是索引跳跃
索引原理与sql优化
使用like关键字时以%开头会导致索引失效
数据类型转换失效
索引字段使用函数转换索引失效
索引列使用加减乘除
不符合最左前缀原则
如果数据库觉的全表扫描比使用索引更快也不会使用索引
or关键字使用必须都是索引列,否则有一个不是索引就会失效
索引失效的场景
单库有瓶颈则分库分表
主从读写分离
利用缓存
架构层面
硬件方面
建立索引,联合索引满足最左前缀原则
能使用覆盖索引的时候尽量使用覆盖索引
根据explain执行计划查看是否使用索引
严格约束字段长度
对于多插入使用批量插入
长的字段建立索引可以使用前缀索引
大量数据查询时可以使用分页查询
水平拆分
垂直拆分
数据量大时进行表拆分
开启慢查询日志 show variables like 'slow_query_log' 查看是否开启; 开启慢查询set GLOBAL slow_query_log = on; 设置慢查询时间set long_query_time=0;
表调优
System
利用主键和唯一键查看一行数据时
constant
基于主键或唯一索引链接两个表,对于索引键值只有一条匹配,被驱动表的类型为 eq_ref
eq_ref
关联查询时使用非唯一索引匹配,,简单查询时使用二级索引匹配返回所有匹配某个单行值
ref
当使用范围扫描> between 时
range
扫描二级索引 如果 extra有using index表示使用的覆盖索引
index
全表扫描
all
type列
id列
使用非主键索引树就可以查询到所需要的数据,一般是覆盖索引,,不需要回表查询
using index
不通过索引查询所需要的数据
using where
using index condition
表示需要使用临时表来查询数据
using temporary
当查询中包含order by 操作而且无法利用索引完成排序操作
using filesort
extra列
explain关键字使用
慢sql优化
读未提交(RU)
rr 只是完全解决了快照读下的幻读
读已提交(RC)
可重复读(RR)
序列化
事务的隔离级别
读已提交每次执行sql查询时都会生成新的readview
可重复读执行第一条查询 sql时生成的readview并且事务结束前都不会发生变化
如果行数据的最新undolog在当前活跃事务列表中那么一定读不到,因为活跃事务id都时readview生成时还没提交的事务id
m_id 当前活跃事务id
如果行数据的最新undolog事务id比当前活跃的最小的还要小表明该事务肯定提交了,一定读
min_trx_id m_id 里面的最小值
如果行数据的最新undolog事务id比最大的事务id大说明这条事务在生成readview时还没开启肯定不读
max_trx_id 最大值 是创建readview时当前事务的最大id+1
如果行数据的最新undolog的事务id和当前事务id相等,说明时当前事务修改的肯定读
creator_trx_id 当前事务id 每开启一个事务都会生成一个
如果最终判断最新的undolog事务id读取不到数据,那么就根据版本链往上找,,然后对比过滤直到找到符合的数据
readview的机制4个标志位
MVCC(多版本并发控制)
全局锁
表锁
当我们对主键和唯一索引加锁时默认锁定的时一行也就是记录锁
行锁
粒度上区分
乐观锁
悲观锁
模式分类
允许数据同时读阻止其它数据写
读锁
共享锁
阻止其它用户读取和更新数据
写锁
排它锁
属性分类
事务在给一行记录加共享锁时,必须先获取该表的意向共享锁
意向共享锁
事务在给一行记录加排它时,必须先获取该表的意向排它锁
意向排它锁
状态分类
在普通索引或者唯一索引上锁定的是一个区间默认锁住的是对应一个索引的左右开范围
间隙锁
记录锁锁的是表中某一条记录,记录锁出现的条件必须中精准命中,并且索引是唯一索引
记录锁
行锁加间隙锁 既包括了范围也包括了当前记录 当使用非唯一索引进行精准匹配时默认加了一个临键锁 左开右闭区间
临键锁
算法分类
mysql锁
回滚日志
mysql
0 条评论
回复 删除
下一页