一、RC和RR区别:
二、mysql中的锁
SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE 的 区别
下面链接里内容需要更正一下:
意向锁是表级锁,是InnoDB存储引擎自动加的,不需要用户干预。
SELECT ... LOCK IN SHARE MODE是共享锁,在加共享锁前必须先取得该表的意向共享锁(IS);
SELECT ... FOR UPDATE是排他锁,在加排他锁前必须先取得该表的意向排他锁(IX);
用法见下面链接:
mysql表锁:频繁插入(insert)的业务,用什么存储引擎更合适? | 数据库系列
三、mysql索引
一、MyISAM的索引
MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。
其主键索引与普通索引没有本质差异:
(1)有连续聚集的区域单独存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录的指针;
(3)普通索引的叶子结点,存储索引列,与对应行记录的指针;
画外音:MyISAM的表可以没有主键。
主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。
二、InnoDB的索引
- InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引(Clustered Index):
(1)没有单独区域存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录(而不是指针);
因为这两个特性,InnoDB的表必须要有聚集索引,并且查询是非常快的:聚集索引,也只能够有一个,因为数据行在物理磁盘上只能有一份聚集存储。
聚集索引选择:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
- InnoDB的普通索引可以有多个,与行记录也是分开存储的,属于非聚集索引:
(1)普通索引的叶子节点,存储主键(也不是指针)
先通过普通索引找到主键,再通过主键索引找到行记录(回表)。
MySQL 索引入门 :索引模型类别、什么情况下创建索引但是没有走索引?(情况:查询优化器选择性)
Mysql索引面试题 - 割肉机 - 博客园:mysql5.6有索引下推。
hash索引使用场景比较局限
- hash索引仅适用于‘=’、‘<=>’和‘in’操作,所以hash仅仅适用于精确查找。
- 不适用于查询排序,因为hash后的数据并不会像原数据一样保持有序。
- 不适用于模糊查询,也就是不能使用like关键字。
- 既然不支持排序,也肯定不支持范围查询咯
- 数据量大容易有hash碰撞,导致查询效率低
sql优化实战:
MySQL的or/in/union与索引优化 | 架构师之路
四、mysql主从复制
1、日志
MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结 - MSSQL123 - 博客园
mysql如何保证数据不丢失: 蚂蚁金服一面:十道经典面试题解析
总结:
- redolog一般默认有两个,循环使用;当数据库事务提交成功时会把page标记为dirty,当脏页刷新到磁盘,redolog的作用也就结束了。
2、主从复制
启动时从库向主库申请拉取binlog,之后主库有更新时推送给从库。
Mysql主从复制&半同步复制原理_Vincent's tech blog-CSDN博客_mysql半同步复制原理
mysql总结:关于MySQL,你未必知道的!