undolog会形成一个链表,链首存储的是最新的记录,链尾放的是最旧记录
后台purge线程,不需回滚或不需参与MVCC数据清理掉
幻读:
如果当前的所有操作都是当前读,不会产生
只有当前读和快照读 for update
readview: 当事务在进行快照读的时候会生成一个读视图来进行可见性判断
trx_list->当前系统活跃的事务id
up_limit_id->活跃事务表中最小的id
low_limit_id->当前系统尚未分配的下一个事务id
不同隔离级别:rc:每次执行快照读
rr:当前事务第一次进行快照读生成readview,之后快照读都用当前readview
第一范式
- 每一列原子性
- 不产生冗余数据
- 简单的二维表
第二范式
- 表里面记录有主键来唯一标识(订单和产品中间表来确定唯一id)
第三范式
- 表结构不冗余 订单表中只有产品id
反范式化设计
- 为性能和读取效率 适当违反对数据库设计范式的要求
- 允许存在部分冗余数据 用空间换时间
聚簇索引
- id主键
- unique索引
- 都没有 使用隐藏列row_id
MRR Multi-Range Read 多范围读取 减少随机IO
为了回表操作 先排序 再找记录回表 减少回表次数
联合索引/复合索引
B+树里所有数据一定是从小到大排序
次级索引是部分有序 脱离A的范围就不是有序的
自适应哈希索引(InnoDb引擎三大特性 自适应哈希索引 双写缓冲区 bufferpool)
innodb存储引擎内部监控索引热数据,然后内部创建一个hash索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)无法人为干预 只能启用或关闭 无法调整参数
show engine innodb status\G
全文检索
全文检索下常规数据库的缺陷:找关键字
Mysql中的全文索引
mysql5.6以前的版本,只有MylSAM存储引擎支持全文索引。从InnoDB1.2.X版本开始,InnoDB存储引擎开始支持全文检索,对应的MySQL版本是5.6.X系列
倒排索引
索引类型:
从数据结构角度:B+树 哈希 FULLTEXT索引 R-Tree索引(对GIS数据类型创建SPATIAL索引)
从物理存储角度:聚集索引clustered index、非聚集索引non-clustered index
从逻辑角度: 主键索引、普通索引、单列索引、多列索引、唯一索引、非唯一索引
密集索引和稀疏索引
密集索引:key值和记录所有数据 聚集索引
稀疏索引: B+树的key值 普通的二级索引 MylSAM(索引文件单独存放)
索引的代价
空间:1个B+树
时间:CUD全部要维护索引
6到7个索引
索引下推
高性能的索引创建策略
- 索引列的类型尽量小
- 数据类型越小,查询比较操作越快
- 数据类型越小,占用空间越小
索引的选择性、离散性和前缀索引
- 选择性 离散性:不重复的值和总记录的比值
- 前缀索引:count(DISTINCT LEFT(order_note,3))/COUNT(*)
select COUNT(DISTINCT order_no)/count(*) cnt from order_exp;