美文网首页
1.2Mysql的索引介绍以及锁机制

1.2Mysql的索引介绍以及锁机制

作者: MelodyOf流沙 | 来源:发表于2021-03-11 18:44 被阅读0次

    索引

    索引的物理文件存储位置

    对于innodb,文件有idb,frm. 索引以及数据存储位置在于idb文件中,frm为表结构。对于myisam,索引存储位置在myi文件中。myd为数据,frm为结构.

    BTree与B+Tree

    BTree和B+Tree都是通过二叉树而演变过来的,二叉树=>平衡二叉树=>B+Tree
    为什么选择使用B+Tree
    二叉树:由于二叉树每个节点最多只有2个子节点,高度高,搜索时间复杂度O(1)到O(logn),磁盘IO次数多
    BTree:高度降低,但对于范围查找磁盘IO次数依然多。
    Hash:Hash树定位某条非常快,但由于是无序的,如果是范围查询,那么效率很低。而且如果索引值有重复,如果重复,只有全表扫描,会引发hash冲突。
    红黑树:树的高度随数据的增加而增加,IO次数多
    B+Tree:只有叶子节点才会有数据,非叶子节点只有key,并且增加了相邻节点之间的指向的指针,这样所有的数据都会形成一个有序的链表,提高了区间访问的性能(比如找18-30的数据,找到18后,按序往后查找即可,不需要重新返回父节点进行查找)。既然要提升索引效率,因为内存读取运算速度远远大于磁盘的运行查找速度,所以磁盘的IO次数越少那么效率也就越高,所以B+树最适合Mysql的索引。

    聚簇索引(主键索引)和非聚簇索引

    索引可以分为聚簇(聚集)索引和非聚簇索引。聚簇索引就是叶子节点存储行数据,而非聚簇索引叶子节点数据存储的非行数据(例如Myisam叶子结点存储的是行数据的物理地址),查到叶子节点后还需要去主键索引表中查到对应的数据信息进行回表查询。

    主键索引/唯一索引/联合索引

    主键索引:一张表只允许又一个主键索引且不能为null
    唯一索引:数据列不允许重复但允许为null的索引列叫唯一索引(非聚簇索引)
    联合索引:允许多个字段一起建立的索引叫联合索引

    索引的最左原则以及优化
    • 联合索引在搜索时满足最左原则,比如联合索引是abc,那么能触发联合索引的是a|ab|abc的搜索查询.
    • 联合索引失效原理:例如字段(a,b)。那么B+Tree是先排序a,在a的基础上对b再进行排序存储节点。所以如果只查询b,那么在没有a排序的基础上,b是无序的也就没有使用到索引。同理如果like "123%"使用了索引,like "%123"未使用索引。
    • 因为mysql有优化器,所以无论我们写where a and c and b 还是怎样都可以用到索引表。索引在遇到(> < bewteen)时会停止匹配. where a= and b like 和 where b like and a= 效果都是一样的,因为mysql优化器会进行优化。

    乐观锁与悲观锁

    什么是死锁

    两个事务争抢资源而互相等待,若无外力作用无法继续向下执行,此时我们就叫做死锁。
    innodb默认有个wait_timeout超时时间(50s)设置,如果事务超时则会自动回滚放弃资源。以此解决死锁问题。

    排他锁

    某行获取到排他锁后,其他事务无法对此行添加任何锁,不能读不能写。

    共享锁

    某行获取到共享锁后,其他事务可以读不能写,但无法添加排他锁。

    MVCC(乐观锁实现的方式之一)

    多版本并发控制,在RR级别下使用MVCC去解决了脏读/不可重复读的问题。MVCC使用undolog实现版本链,通过ReadView对象以一定规则实现MVCC

    悲观锁

    添加X锁实现悲观锁,让其他事务进行锁等待

    间隙锁

    当我们用范围条件,例如id>1 and id<9 则会对1-9所有行数据加锁,如果当前表没有id=2这个数据,那么也会被锁住,这个锁就叫间隙锁。

    相关文章

      网友评论

          本文标题:1.2Mysql的索引介绍以及锁机制

          本文链接:https://www.haomeiwen.com/subject/dqvnqltx.html