普通索引 vs 唯一索引
~ 查询性能,唯一索引有停止条件,由于操作都是按页的,差距很小
~ 更新操作中有change buffer,写入磁盘是在查询/数据库关闭/后台线程里触发,由于唯一索引要判断是否唯一,故无法用到,普通索引改为唯一索引,大量插入可能性能下降,写多读少的非唯一索引适用
redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗
虽然是只更新内存,但是在事务提交的时候,我们把 change buffer 的操作也记录到 redo log 里了,所以崩溃恢复的时候,change buffer 也能找回来
优化器索引选择:基于采样统计数据数据(analyze table),综合比较扫描行数、是否使用临时表、是否排序等,也可force index
字符串太长建前缀索引,取一部分减少空间浪费,但是会增加扫描行数,且会失去覆盖索引对查询性能的优化,需要综合评估
倒序OR哈希值建索引 ~ 无法支持范围,哈希要计算+增加字段,倒序要反序
脏页 ~ 内存数据页跟磁盘数据页内容不一致
flush时机: a. redo log满 b. 内存不足 c. 空闲时段 d. 数据库正常关闭
可能的性能问题
一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长
日志写满,更新全部堵住,写性能跌为 0
设计策略控制刷脏页的速度
innodb_io_capacity InnoDB 磁盘能力
innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 75%
innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷自己的