mysql 查询子句:mysql
子查询算法
隔离级别:sql
mysql默认级别:可重复读session
1. select @@global.tx_isolation; 2. select @@session.tx_isolation; 3. set global transaction isolation level read committed; //全局的 4. set session transaction isolation level read committed; //当前会话
mvcc(Multi Version Concurrency Control):为了实现快照读(读写不冲突)并发
redo log: mysql将事务操做过程当中产生redo log,事务提交时flush到硬盘(顺序的)mvc
1. 当主机崩溃重启,能够从redo log获取日志恢复
undo log: 事务操做过程当中,记录修改的回滚操做,事务回滚能够用上app
1. mysql根据 undo log 能够回溯到某个版本,实现mvcc
innodb是以汇集索引组织数据的。数据行中包含rowid(主键id),还包括:函数
1. trx_id:最近修改的事务id 2. db_roll_ptr:指向undo分段中的undo log
当前读:特殊的读操做,须要加锁:工具
行级锁是锁索引,的前提条件是要匹配索引,不然退化为表锁(锁汇集索引);优化
死锁的例子:
session1: select * from t1 where id=22 for update;
1. empty set
session2: select * from t1 where id=23 for update;
1. empty set
session1: insert into t1 values(22, ...);
1. 一直未返回
session:2 insert into t1 values(23, ...);
1. Error 1213 (40001): Deadlock found when trying to get lock; ...
分析:
1. 当在存在的行进行锁的时候,mysql只有行锁 2. 当对为存在的行进行锁的时候,mysql会锁住一段范围(gap锁) 1. 范围: 1. 上述例子(id22,23都不存在): 1. 假设以前表有id(11,12),锁住的范围:(12,无穷大) 2. 假设以前表有id(11,30),锁住的范围:(11,30) 3. 假设以前表有id(50,xxx),锁住的范围:(无穷小,50)
表链接
笛卡尔积:A X B = { (a,b) | a ∈ A and b ∈ B }, (a,b) 叫作有序偶
1. 笛卡尔积的数量= num(A) * num(B)
不加任何规则的链接:select * from users,table2,结果是笛卡尔积
1. 若是带了where语句,只筛选出对应表的符合记录的行 2. 和不带链接规则的 inner join一致
inner join:内链接,
1. 若是不带链接规则和上面同样,mysql中 cross join 和 inner join相似 2. 若是带链接规则,结果为笛卡尔积中去掉不知足链接规则的记录 3. 链接规则的类型: 1. 等值 2. 不等值 3. 自链接(相同表不一样字段)
外链接:
1. left join: 左表全 右表没有就算null 2. right join:
联合查询: union
GTID复制:mysql5.6+
主从复制
索引:
联合索引的匹配规则:最左原则
1. 不知足,可能出现两个状况: 1. 次级字段的全部记录是有序的,此时explain中的type=index,表示扫描全index 2. 不是有序的,用不到索引
explain(关键字段):
1. select_type:查询类型, 1. simple:通常是简单查询,不使用union或子查询 2. subquery:子查询中的第一个select 3. primary:最外层的select 2. type:mysql找到所需行的方式,又叫“访问类型”,由差到好的顺序: 1. type=ALL:全表扫描(通常须要进行优化) 2. type=index:整个索引扫描(不知足最左匹配可能会引发) 3. type=range:使用一个索引来检索给定范围的行 4. type=ref:mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每个数据都进行一一的扫描判断 5. type=eq_ref:相似ref,区别是使用的索引是惟一索引 6. const、system:常量匹配,主键匹配 3. rows:找到所需记录须要读取的行数(估计值) 4. extra:详细信息,常见: 1. Using index:只查询索引就能获得结果(覆盖索引) 2. Using where:须要经过索引再检索实际数据进行过滤 3. Using temporary:使用临时表 4. Using filesort:使用临时文件排序
null与索引的关系:
1. is null 是可使用索引的 2. is not null 不能 3. 但最好能不用null就不用
online ddl
通常状况经过新建临时表实现,参考:https://cloud.tencent.com/dev...
1. 新建临时表为最新的表结构,在业务低峰期加锁拷贝数据到新表,rename旧表和新表 2. 其余实现: 1. Facebook工具pt-osc 经过触发器同步变化数据 不锁表 2. gh-ost,经过主从同步binlog方式
mysql5.6+支持在线online ddl
1. 但执行开始也须要一个短暂锁表的过程,准备元数据 2. 分为 inplace 和 copy 1. 添加字段 可能inplace 和 copy 但支持并发的dml 3. frm文件是表结构定义 4. mysiam: table.frm, table.MYD, table.MYI 5. innodb: table.frm, *.idb 6. innodb_file_per_table
其余参考资料:
mysql加锁处理分析
http://hedengcheng.com/?p=771
MySQL基于GTID的复制实现详解
http://www.ywnds.com/?p=3898