文章目录
一个事务查询范围,另一个事务插入数据,会发生什么
mysql 事务不加锁一致性读:当事务隔离级别为可重复读时,事务A进行查询,事务B进行改、删除、插入时,进行查询的事务A不受事务B的影响,仍然为原始数据库中的数据,即使事务A内对数据做了更改会提交,事务A查询到的仍然为事务开始之前数据库中的数据;当事务隔离级别为读提交时,事务A会读取事务A内的最新提交的数据,如果事务B对事务有更改或提交新数据,不会影响事务A的查询数据。
最左匹配原则
MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
可以看到 a 的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。但是我们又可发现 a 在等值的情况下,b 值又是按顺序排列的,但是这种顺序是相对的。这是因为MySQL创建联合索引的规则是首先会对联合索引的最左边第一个字段排序,在第一个字段的排序基础上,然后在对第二个字段进行排序。所以b=2这种查询条件没有办法利用索引。
explain 语句的关键点以及 ES 分析语句性能的关键字
MySQL explain 应用详解(吐血整理🤩)
关键点:
- rows:扫描行
- type:访问的类型
- key:实际使用到的索引,如果为 null ,则没有使用索引
Type:表示从表中查询到行所执行的方式
(从左往右,越靠左边的越优秀)
NULL > system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL
分别解读一下:
- system:表只有一行记录
const
表示通过索引一次就找到了,const 用于比较 primary key 或 uique 索引,因为只匹配一行数据,所以很快,如主键置于 where 列表中,MySQL 就能将该查询转换为一个常量。eq_ref
:使用唯一索引扫描,常见于多表连接中使用主键和唯一索引作为关联条件。ref
:非唯一索引扫描,还可见于唯一索引最左原则匹配扫描。- range:索引范围扫描,比如,<,>,between 等操作。
index
:index只遍历索引树,通常比All快。因为,索引文件通常比数据文件小,也就是虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读的。- ALL:如果一个查询的 type 是 All ,并且表的数据量很大,那么请解决它!!!
Key 字段
实际使用的索引,如果为 null,则没有使用索引,否则会显示你使用了哪些索引,查询中若使用了覆盖索引(查询的列刚好是索引),则该索引仅出现在 key 列表。
Extra字段
- Using filesort 表示当SQL中有一个地方需要对一些数据进行排序的时候,优化器找不到能够使用的索引,只能硬排
- Using tempporary 表示在对MySQL查询结果进行排序时,使用了临时表,这样的查询效率是比外部排序更低的,常见于 order by 和 group by。
- Using index 表示使用了索引,很优秀👍。
为什么使用 B+ 树
树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
你可以想象一下一棵100万节点的平衡二叉树,树高20。一次查询可能需要访问20个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要10 ms左右的寻址时间。也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10 ms的时间,这个查询可真够慢的。
为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N叉”树。这里,“N叉”树中的“N”取决于数据块的大小。
bignlog ,dolog,redo log 的区别
https://blog.csdn.net/liushengxi_root/article/details/123190173