MySQL

2019-10-27  本文已影响0人  紫色红色黑色

组成

MySQL结构是分为:连接器、分析器、优化器、执行器
连接器负责连接控制、用户认证。分析器负责语法分析、表字段分析。优化器负责优化SQL,确定执行计划。执行器负责执行执行计划。

日志

事务日志

更新语句写日志流程:先查询出该记录,然后插入redo log,更新redo log该记录为prepare状态。再插入binary log,最后更新redo log状态为commit。更新结束。
插入binary log前数据库宕机,数据恢复时会判断该数据没有执行完,不予恢复。插入binary log后数据库宕机,数据恢复时会判断该事务再binary log已写完,会将redo log中prepare状态的事务继续执行,更新为commit状态。

redo log

重做日志,是循环写,记录数据页做了什么改动。由内存中redo log buffer和硬盘上redo log file组成。配置中innodb_flush_log_at_trx_commit设置为1,表示每次事务提交更新buffer后再刷新数据到硬盘。保证数据不丢失。

undo log

回滚日志,记录每个事务版本下的数据做了什么修改。用于实现MVCC和事务回滚。

binary log

二进制日志,记录数据操作逻辑。查看binlog格式

show variables like 'log_%';
show variables like '%binlog_format%';
show binary logs;

当前读和快照读

事务

幻读:当前事务再读取某个范围内记录时,另一个事务在这个范围内插入了新的记录。当之前的事务再次读取该范围的记录时,会产生幻行。InnoDB通过MVCC解决了幻读。

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
读未提交
读已提交
可重复读
串行化

MVCC

Mutiversion Concurrency Control。InnoDB的MVCC是通过在每行记录上保存两个隐藏列实现的。一个列保存行的创建时间、另一个列保存行的过期时间(删除时间)。列值存储不是真实的时间,而是系统版本号(System version number)。每开始一个新的事务,系统版本号会递增。事务开始时的系统版本号作为事务的版本号。用来和查询到的记录的版本号进行比较。下面看下可重复读隔离级别下的MVCC具体操作。

MVCC只在可重复读和读已提交隔离级别下工作,其他两个隔离级别和MVCC不兼容。因为读未提交总是读最新的行,而不是符合当前事务版本的行,而串行化是对所有读取的行加锁。

锁是保护多线程或多进程同时访问某一资源的机制

查看最近的死锁日志

show engine innodb status;

索引

是为了配合高效查询算法的一种数据结构,innodb中是b+tree。这个tree上的叶子节点key为主键,value是行数据。普通节点只存储key和next。又称索引组织表。

优化步骤

慢查询

查看慢查询是否开启

show variables like '%slow_query_log%';
show variables like '%long_query_time%';
show global status like '%Slow_queries%';

开启

set global show_query_log=1;

当前session休息

select sleep(4);

mysqldumpslow慢查询工具

explain

order by

show profile

查看profile是否开启

show variables like '%profiling%';

查看profile状态

show profiles;
show profile cpu,block io for query 3;
上一篇 下一篇

猜你喜欢

热点阅读