undolog会形成一个链表,链首存储的是最新的记录,链尾放的是最旧记录
后台purge线程,不需回滚或不需参与MVCC数据清理掉
幻读:
如果当前的所有操作都是当前读,不会产生
只有当前读和快照读 for update
readview: 当事务在进行快照读的时候会生成一个读视图来进行可见性判断
trx_list->当前系统活跃的事务id
up_limit_id->活跃事务表中最小的id
low_limit_id->当前系统尚未分配的下一个事务id
不同隔离级别:rc:每次执行快照读
rr:当前事务第一次进行快照读生成readview,之后快照读都用当前readview

第一范式

  1. 每一列原子性
  2. 不产生冗余数据
  3. 简单的二维表

第二范式

  1. 表里面记录有主键来唯一标识(订单和产品中间表来确定唯一id)

第三范式

  1. 表结构不冗余 订单表中只有产品id

反范式化设计

  1. 为性能和读取效率 适当违反对数据库设计范式的要求
  2. 允许存在部分冗余数据 用空间换时间

聚簇索引

  1. id主键
  2. unique索引
  3. 都没有 使用隐藏列row_id

MRR Multi-Range Read 多范围读取 减少随机IO
为了回表操作 先排序 再找记录回表 减少回表次数

联合索引/复合索引

B+树里所有数据一定是从小到大排序
次级索引是部分有序 脱离A的范围就不是有序的

自适应哈希索引(InnoDb引擎三大特性 自适应哈希索引 双写缓冲区 bufferpool)

innodb存储引擎内部监控索引热数据,然后内部创建一个hash索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)无法人为干预 只能启用或关闭 无法调整参数

  1. 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个索引
索引下推

高性能的索引创建策略

  1. 索引列的类型尽量小
    1. 数据类型越小,查询比较操作越快
    2. 数据类型越小,占用空间越小
  2. 索引的选择性、离散性和前缀索引

    1. 选择性 离散性:不重复的值和总记录的比值
    2. 前缀索引:count(DISTINCT LEFT(order_note,3))/COUNT(*)
      1. select COUNT(DISTINCT order_no)/count(*) cnt from order_exp;