-
事务
- InnoDB 的行数据有多个版本,每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读,一致性读会根据 row trx_id 和一致性视图确定数据版本的可见性。
- 对于可重复读,查询只承认在事务启动前就已经提交完成的数据;
- 对于读提交,查询只承认在语句启动前就已经提交完成的数据;
- 而当前读,总是读取已经提交完成的最新版本。
- 需要区分行锁、MDL 锁和表锁的区别。对 InnoDB 表更新一行,可能过了 MDL 关,却被挡在行锁阶段
-
索引
-
唯一索引和普通索引的选择
- change buffer
- 对于查询过程,二者效率上的区别不大
- 对于更新过程
- 若当前需要更新的页在内存中,那么二者却别也不大,直接更新内存即可,唯一索引比普通索引只多一步判断是否冲突的操作
- 若当前若当前需要更新的页不在内存中
- 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束
- 对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了
- 实践意义:
- 如果碰上了大量插入数据慢、内存命中率低的时候,可以给你多提供一个排查思路。即是否是使用了唯一索引,因为每次都要将判断是否有冲突,就需要将磁盘上的数据读入内存中,而如果是普通索引,直接将插入操作记录在change buffer中即可
- 然后,在一些“归档库”的场景,你是可以考虑使用普通索引的。比如,线上数据只需要保留半年,然后历史数据保存在归档库。这时候,归档数据已经是确保没有唯一键冲突了。要提高归档效率,可以考虑把表里面的唯一索引改成普通索引
MYSQL学习总结
最新推荐文章于 2024-07-20 16:33:27 发布