学习记录-MySQL实战45讲 ~ 9

普通索引 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 时表示不找邻居,自己刷自己的

原文地址:https://www.cnblogs.com/it-worker365/p/14469263.html