Mysql架构和历史
逻辑架构
并发控制
锁分类:
共享锁 读锁
排它锁 写锁
锁策略:
表级锁
行级锁
注:存储引擎自己实现锁机制
事务
ACID理解:原子性、一致性、隔离性、持久性
隔离级别:
RU(读未提交):脏读、不可重复读、幻读
RC(读已提交):不可重复读、幻读
RR(可重复读):幻读
S(可串行化):加锁读
注:Mysql默认隔离级别为:RR,通过mvcc(多版本控制)解决幻读
事务是由存储引擎实现的
死锁
死锁是两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
注:Innodb处理死锁的方法是,将持有最少行级排它锁的事务进行回滚
数据类型与Schema优化
数据类型的选择
更小的通常更好
简单更好
尽量避免NULL
举例:
使用Mysql内建的类型而不是字符串存储日期和时间
用整型存储IP地址
尽量避免使用null,索引字段不能为NULL
DATETIME和TIMESTAMP的区别
Schema的设计
避免太多的列(宽表)
避免太多的关联
枚举少用
尽量避免使用null
范式和反范式相结合
创建高性能的索引
在mysql中索引是在存储引擎层而不是在服务器层实现的,且各存储引擎对相同索引的实现也不一样
数据和索引的统计信息放在存储引擎中
索引分类
底层实现:
B-Tree索引
哈希索引
…
功能:
主键索引
普通索引
唯一索引
组合索引
索引的优点
大大减少了服务器需要扫描的数据量
可以帮助服务器避免排序和临时表
可以将随机I/O变为顺序I/O
索引策略
独立的列(不能是表达式的一部分或函数的参数)
最左前缀和索引选择性
聚簇索引
覆盖索引
使用索引扫描来做排序
冗余和重复索引
索引和锁
InnoDB在二级索引上使用共享(读)锁,但在主键索引上使用排它(写)锁
总结
单行访问是很慢的
按顺序访问范围数据是很快的
索引覆盖查询是很快的
查询性能优化
优化数据访问
是否向数据库请求了不需要的数据
是否在扫描额外的记录
重构查询的方式
复杂查询or多个简单查询
切分查询
分解关联查询
查询执行的基础
Mysql客户端/服务端通信协议
半双工
查询状态 Show full processlist
Sleep:
Query:
Locked:
Analyzing and statistics:
Copying to tmp table:
Sorting result:
Sending data:
查询缓存
通过对一个大小写敏感的哈希查找实现的
查询优化处理
语法解析器:校验语法
预处理器:校验字段、
查询优化器:将语法树转化成执行计划,是一个很复杂的过程
查询执行引擎
返回结果给客户端
查询优化器的局限性
查询优化器的提示
优化特定类型的查询
未完待续