MySQL Knowledge Graph
- Performance
- MySQL cluster
- Sharding
- Indexing
- MySQL architecture
- Lock
- MySQL事务 (ACID)
Architecture
最上层:connector
中间:SQL Layer
包含:connection pool (包括,Auth,thread,check memory,cache),以及 Management Services & Utilities
- SQL interface 接受sql语句
- Parser 词法分析,判断能否执行 (语法树)
- Optimizer 优化器,你写的不够完美,通过:执行查询计划(explain)
eg 多表关联:小结果集,驱动大结果集 - Cache and Buffer (MySql 8.0之后弃用)
下层:storage layer
- 就是跟文件打交道的。
- 多种引擎,可选:MyISAM(快),InnoDB(默认,功能更全),Memory(极快,易丢失)等等
对比 MyISAM 和 InnoDB
skip
现在基本都是 InnoDB。并发 + 支持事务 + 隔离性。
如果基本就是读写,数据量巨大,无并发,可以选MyIsam。
Physical 结构
MySQL 的文件,分2中:
- 索引文件
- 日志文件
其实都是存在 /var/lib/mysql/ 中。
日志文件
errorlog
默认开启,默认记录为 mysqld.log
binlog(binary log)
记录所有ddl和dml语句(数据的变化),但是不记录select语句。
是一种压缩日志,以“事件”的形式保存。
有好多个文件,因为每次 restart MySQL,生成一个新的 binlog。
general query log
增删改查,全都存。一般不开启。
slow query log
如果差的很慢,存一下。用于调优。
long_query_time = 3, 意思是超过3s的,就记录到慢查询日志中。
重做日志
回滚日志
中继日志(用作:主从复制)
查询log的开启状况:
查看所有log On/Off:
show varibles like ‘log_%’;
查看数据位置:
show varibles like ‘%datadir%’;
Indexing
索引的作用:
- 搜索
- 排序
- 索引下推 ICP
- 覆盖索引 (select字段作为索引)
查看 索引:show index from tuser;
索引的种类:
- 主键索引
- 唯一索引 (Unique Index)
- 组合索引
- 单列索引(Index),或普通索引
原理
MyISAM / InnoDB : B+ tree 索引。
Memery:Hash 索引
B+ tree
B Tree 高度一般在 2~4 层。(其中,3 层就可以支持 20G,4层可以支持到 20TB)
平衡多路查找树(B-Tree)
B tree和B+ tree区别:
- 非leaf节点 是否存储数据。(B tree 存,B+ tree 不存)
- leaf 节点是一个 linked list
MySQL locking
乐观锁
- 程序实现:版本号 + 时间戳。
- 通常是Redis实现的。这里先不讲。
悲观锁
我用了,你就不能用。(MySQL系统默认都是悲观锁)
- 表级锁(expensive,少用) 只有当 行锁升级为表锁时,才会用到表锁。
- 行级锁(InnoDB)
- 共享读锁 - 手动加
- 排他写锁 - 自动加
eg. session 1 write 时候,拿到 写锁,session2 连读都读不了。
Transaction 事务
四大特性ACID:
- Atomicity
- Consistency:执行前后,是稳定一致的。
- Isolation:多个tx之间,互不影响
- Durabilitity:一定全部写入磁盘。