数据库索引

b树和外部存储

2-3树和2-3-4树插入时的不同

2-3树插入过程中碰到满的非叶子节点不需理会,一直找到要插入的叶子节点,如果是满的就进行分裂操作,不满就直接插入。属于自底向上的分裂。向上分裂的数据项只有和要插入的数据项比较后才能确定。

2-3-4在插入新的数据项的过程中只要碰到满的节点就开始向上分裂。他的数据项是有序的,所以分裂的是中间的数据项。

外部存储

磁盘中的数据存储是以块为单位,根据系统的不同称为块,页,分配单元等名字。块的大小根据操作系统确定。磁盘驱动器每次读或写至少一个数据块这样效率最高

B树

每一个节点可以当作一个块,节点中保存Data(关键字+文件数据)和子节点的引用,查找时把含有根的块读入内存,比较关键字确定要读取的子节点的位置然后读入字节点对应的块,持续这个过程。直到找到这个数据。插入时类似于2-3树,把一半的数据分裂到新节点中剩下的一半在原节点中,把对应的中间数据项上移到父节点中,这种自底向上的操作保证了每个节点的数据项尽可能是满的。

索引

B+树索引

顺序索引+B树

非叶子节点只存储索引值,所以高度比B树矮,磁盘IO次数更少

所有的叶子节点都有一个链指针指向下一个叶子节点且有序,所以方便在叶子节点做范围统计,利于对数据库的扫描。

非叶子节点的指针树和关键字个数相同

叶子节点存储我们真正需要的数据,所以B+树每次都需要检索到叶子节点。且查询效率稳定

hash索引

不能使用组合索引

不能使用范围查询,仅满足“=”,“IN”操作

当key值重复多时即hash冲突严重时性能降低。

聚合索引(也叫密集索引)
  1. innodb中

若一个主键被定义,则该主键作为密集索引。若没有用该表第一个唯一非空索引做聚合索引。不满足以上条件innodb内部生成一个隐藏主键。非聚合索引中非叶子节点存储key值叶子节点存储主键值**。主键索引存储整张表的行记录数据。innodb中每张表只有一个聚合索引

mysql优化器会选择最有的情况,不一定选择主键索引。

image-20210317181926600

  1. myisam

使用稀疏索引。叶子节点中不存储表数据(表数据存储在.myd文件中)而是存储表数据地址。

image-20210317173153564

如何定位并优化满查询sql

根据慢日志定位慢查询信息

show variables like %quer%;
set global show_query_log =  true //打开满查询日志
set global long_query_time = 1//设置时间,执行超过这个时间就记录,也可在my.ini中永久配置
explain关键字段
  • type

image-20210317180252343

  • extra

image-20210317180354371

using where 表示找到根据索引找到表查询数据

  • 匹配全值
  • 对索引的值能够进行范围查找 type=range
  • 匹配最左前缀,用户复合索引
  • 仅仅对索引进行查询 此时extra是using Index,不需要索引回表查找

最左匹配原则

image-20210317184737393

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值