slow query log(慢查询日志)
记录sql执行时间长的查询语句,应用场景:解决sql慢查询问题。
找到慢查询日志是优化sql的第一步,然后可以通过explain获取慢sql的执行计划相关信息。
show variables like "slow_query_log" 查看慢查询日志是否开启,默认关闭
set globle_slow_query_log=on 开启命令
set globle long_query_time=1 修改慢查询时间,默认为10
show global status like '%Slow_queries%' 查看当前慢查询个数
如何优化慢SQL?
通过执行计划可以数据表的查询顺序,数据查询操作的操作类型,索引可以命中情况,索引实际命中情况等信息
show profile /show profiles 可以展示SQL语句的资源使用情况,例如cpu使用,cpu上下文切换,io,内存使用等
binlog(二进制日志)
binlog记录MySQL数据库所有数据的更改情况,DDL,DML等,逻辑日志
binlog格式:
Statement模式:记录每一条sql(文件小111111111111111111,性能号,io压力小)
Row模式(推荐):记录每一行的具体变更(准确性)
Mixed模式:上述两种模式混合
binlog作用用来做什么?
主从复制:1.mysql将变化数据存储到binlog日志中2.从库连接主库3.从库向主库请求数据4.主库向从库发送binlog5.从库接收binlog将其写入自己的relay log中6.从库将relay log同步到数据本地
canal底层依赖的也是binlog
误删了数据库,binlog还可以数据恢复
binlog刷盘时机:sync_binlog参数控制,取值范围0-N
0:不强制要求,系统自行判断
1:每次事务提交都要将binlog写入磁盘
N:每N个事务,才将binlog写入磁盘
redo log(重做日志) 物理日志
保证事务的持久性,记录页的修改 表空间,数据页号,偏移量,具体修改数据
事务提交时先将redolog 刷新到磁盘,这样就算数据库宕机,重启后也能恢复
redolog采用循环写入的方式
什么时候会出现数据丢失:
1.redolog写入logbuffer但未写入pagecache中,数据库崩溃
2.redolog写入pagecache但未写入磁盘中,操作系统崩溃
为什么每次不直接刷盘呢?
性能太差,innodb引擎页的大小为16kb,修改页只修改了几个字节的数据,一次刷盘需要把整个页都刷新到磁盘,而且,页可能不相邻,会随机io,而redo log是顺序io,且一条redolog记录只占几十个字节
undo log(撤销日志)逻辑日志
保证事务原子性。是逻辑日志,记录与操作相反的sql语句,当回滚时,执行逻辑sql
MVCC的实现依赖于:隐藏字段,undo log ,Read View(快照读SQL执行时MVCC提取数据的依赖)