关于Mysql核心技术的理解

什么是索引

索引是一种分散存储的数据结构
mysql中索引是大部分存储在硬盘的,有一部分是在缓存中

索引的优点

极大的减少了存储引擎需要扫描的数据量
把随机IO变成顺序IO
可以帮助我们在 分组 排序 的时候避免使用临时表

Mysql索引之B+树

面试中经常会被问到为什么mysql会使用B+树索引呢?B+树和其他树形结构有什么区别呢?
带着这两个问题,我在网上一顿狂览,总结了以下几个关于树形结构的对比
https://www.cs.usfca.edu/~galles/visualization/BST.html

二叉查找树
	   分布不均,左右两侧的高度差不平衡
	   有可能要扫码的数据在链表的后面,就需要匹配前面n次的数据,IO次数太多	

平衡二叉树
   树的高度差最大保持在1   
   当插入时候某个根节点的子节点一侧比另外一侧的高度大于1时,就触发旋转调整,保持高度差为1
   整个树的高度比较高时查询做的IO次数越多,这也是Mysql 不使用平衡二叉树的原因之一
   每一个磁盘块(一页)保存的数据量小,没有很好利用磁盘交换特性、和磁盘预读能力,从而带来的频繁IO操作
   
B树 多路平衡查找树
   绝对平衡树
   一页可以存比较多的数据量,mysql 中一页加载16K 的数据量
   路数= 16*1024/ (4(int占用空间)+4(数据引用空间)) 假设int 类型的数据 长度为4 byte 计算,那么每一页将大概可以存储 2048 个数据。
   每个节点上有多少个关键字就有多少个数据区,也即每个节点的容量=数据类型大小+数据引用大小+数据区大小。	
   
B+树 加强版的多路平衡查找树
	B+树关键字搜索采用左闭合区间[ )
	B+树非叶子节点不保存数据相关信息,只保存关键字和子节点引用,这一点和B树是完全不同的,所以B+树的枝节点能存储更大的数据量。
	B+树关键字对应的数据保存在叶子节点中
	B+树叶子节点是顺序排列的,并且相邻节点具有顺序引用关系
	相对于B树来说,B+树的扫表能力更强,因为只需扫描所有叶子节点即可,而B树的话需要扫描包括非叶子节点才能得到全部数据
	查询效率比B树更加稳定,查询必须要寻址到最后一层叶子节点才能找到数据	
	

MyISAM 和InnoDb 数据引擎中的B+树区别	
   MyISAM 的文件有.MYD 数据文件 .frm 表定义文件 .MYI 索引文件 ;InnoDb 的文件有 .frm 表定义文件 和 .ibd 数据文件
   MyISAM 的叶子节点存储的是数据在磁盘上的引用地址,InnoDb在叶子节点存储的是主键索引对应的数据
   MyISAN 的主键索引和非主键索引都是一样存储在 .MYI文件中的、而数据则存储在.MYD文件中
   InnoDb 是以主键索引来组织数据的存储,也叫聚集索引,数据和主键存储在.IBD文件中
   InnoDb 的表如果没有建立主键索引的话,默认会自动创建一个6byte 的int 类型主键索引
   InnoDb 的辅助索引(除主键索引之外的索引)查找数据时,先通过辅助索引查找到主键索引,然后再通过主键索引去查具体数据

索引建立的原则

高离散性(列clonum 中存在重复数据占总体的比例越高,离散性越低)
最左匹配原则
查询条件覆盖索引

mysql 查询优化-查询执行的路径

mysql客户端、服务端通信
	"半双工"方式
查询缓存					
	
查询优化处理
查询执行引擎
返回客户端

查看mysql客户端和服务端的通信连接状态

查看命令 show full processlist/show processlist
sleep 表示线程正则等待客户端发送数据
query 连接线程正在执行查询
locked 线程正在等待表锁释放
sorting result 线程正在对结果排序
sendint data 向请求端发送数据
对于出现问题的连接可以用 kill {id} 杀掉链接

在mysql开启一个事务

 setAutoCommit = off
 begin
 do someThings
 commit

Sql92定义的事务隔离级别

Read uncommit 读未提交 (脏读、不可重复读、幻读)
Read commit 读已提交   (不可重复读、幻读)
Repeatable Read 可重复读  (幻读)
Serializable 串行化    

InnoDb与其他引擎的事务隔离级别对比

在RepeaTable Read 级别中不会出现幻读情况,这是InnoDb与其他引擎最大的不同
InnoDb 通过锁和MVCC原理实现事务隔离级别控制
InnoDb 支持行锁和表锁(另类的行锁,通过锁住所有行来实现表锁)

Mysql InnoDb 锁类型

共享锁(行锁)Shared Locks
	又称为读锁,同一行数据被一个事务加上读锁后,仍然可以被其他事务加上读锁,但是不能被其他事务加上写锁。
	加锁方式:select * from table where id = 1 LOCK IN SHARE MODE;
排它锁(行锁)Exclusive Locks
	又称为写锁,同一行数据被一个事务加上写锁后,不能被其他事务加读锁和写锁,其他事务可以查询当前行数据但不能修改直到获锁的事务提交或者回滚。
	InnoDb 的行锁是针对索引来加锁的
	当加锁的数据没有使用索引去检索时会锁整个表的所有行记录,即另类的表锁,所以在使用排它锁的时候要特别注意是否引用到了索引列去加锁如:
	 where name = 'xx'(name 必须是索引列,否则将锁表)
	加锁方式:UPDATE INSERT DELETE 这些操作自动加排它锁,手动加排他锁方式:select * from table where ... for update
意向共享锁(表锁)Intention Shared Locks
	加一箱共享锁前先检查有无该标志,有则不加,无则加表锁
意向排它锁(表锁)Intention Exclusive Locks
	加一箱共享锁前先检查有无该标志,有则不加,无则加表锁
自增锁 Auto Inc Locks

行锁的算法
记录锁 Record Locks
间隙锁 Gap Locks
	
    临键锁 Next-key Locks 
	Mysql 默认的行锁算法

表锁加锁方式:Lock table tablename read/write;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值