事务:
ACID
隔离级别:
查看mysql 隔离级别:
show global variables like '%isolation%';
设置mysql 隔离级别:
set global tx_isolation ='REPEATABLE-READ';
四种隔离级别:
1.未提交读:事务中读修改,即使没有提交,对其他事务也是可见对,事务中可以读取未提交的数据,被称为脏读。
2.提交读(不可重复读):一个事务开始,只能看见已经提交的事务所做的修改,即一个事务 commit 了,对于其他事务是可见的,执行两次同样的查询,可能会得到不一样的结果。
3.可重复读:解决了脏读问题,保证了同一个事务中多次读取同样记录的结果是一致的。mysql 的默认隔离级别。
4.可串行化:最高的隔离级别,通过强制事务串行执行,每一行数据上加锁,一般在非常需要确保数据一致性而且接受没有并发情况下,才考虑采用该级别。
Mysql 存储引擎:
查看mysql 支持的存储引擎,如下,可以看到各种引擎是否支持事务以及XA(分布式事务协议);
show engines;
权限与安全相关:
索引:
索引类型:
B-Tree 索引(多路搜索树)
一般所说的都是b-tree 索引,可以加快访问数据的速度,不需要全表扫描来获取数据,B-tree 索引适用于全键值 键值范围或键前前缀查找;
(一)如下查询类型 b-tree 索引查询会有效果:
1.全值匹配:与索引中的所有列进行匹配;
2.匹配最左前缀:首先会匹配索引中的最左边的列的数据;
3.匹配列前缀:索引匹配某一列的值的开头部分,不如 name like 'c%' 会使用到name 索引 like '%c%' 这个就不会;
4.匹配范围值:索引中范围查找;
5.只访问索引的查询:覆盖索引,下面有说;
(二)B-tree 索引的限制,也可以作为我们日常索引失效的排查点:
1.如果不是按照索引的最左列开始查找,则无法使用索引;
2.不能跳过索引中的列;
3.如果查询中有某个列的范围查询,其右边的所有列无法使用索引;
hash 索引
只有精确匹配到索引所有列的查询才有效,hash 索引将所有的哈希码存储在索引文件中,哈希表中保存指向每个数据行的指针;
哈希索引查找的速度非快,但也有它的限制:
1.哈希索引数据不受按照索引值顺序存储的,也就是说无法使用排序;
2.哈希索引只包含哈希值和行指针,不能够使用索引中的值来避免读取行;
3.不支持部分索引列匹配查询,比如(a,b)建立的索引,如果只查询数据a 则无法使用该索引;
4.只支持等值比较查询,不支持范围;
5.hash 冲突导致的查询以及删除数据维护的链表结构;
聚簇索引(主键索引 innodb):
聚簇索引并不是单独的索引类型,而是一种数据存储方式;
InnoDB 表是基于聚簇索引建立的,按照索引来存储数据,用户数据存储在聚簇索引上,聚簇索引对主键查询有很高的性能。
如果没有定义主键,innodb 会选择一个唯一的非空索引来代替,如果没有会隐士定义个主键来作为聚簇索引。
聚簇索引的叶子节点存放的是整行的值,所以可以通过主键索引很快的获取到整行的数据。
二级索引(普通索引):
二级索引的叶子节点包含了引用行的主键列,这样的策略减少了当出现行移动或者数据页分裂时二级索引的维护工作;
二级索引由于保存的是行的主键值就意味着通过二级索引查找行的数据时候存储引擎需要找到二级索引的叶子节点获取对应的主键值,通过这个值其聚簇索引中查找对应的行。
覆盖索引:
如果一个索引叶子节点包含所有需要查询的字段的值,我们称为覆盖索引,避免对主键索引的二次回表查询。
查询优化: