• 【Mysql-索引的底层结构】


    1、为什么索引结构使用B+树

    (1)平衡二叉树

    在这里插入图片描述

    a、如果此时我们查找10需要走3次,并且随着树的深度,查询效率越低
    b、如果我们要进行范围查找,查询大于5的数,需要进行遍历

    (2)B树

    在这里插入图片描述

    特点: 一个节点可以存储两个值
    高度:3 (相比平衡二叉树小了1),所以查找速度也就很快了,如果找10,只需要找2次
    但是,他也是存在回旋查找的问题的,比方说查找5,会返回到6。。。。。
    (3)B+
    在这里插入图片描述

    特点:我们会发现和B树存在不同的是,叶子结点存在了链表排序
    这样就解决了回旋查找
    叶子结点只存储key,非叶子结点即存储key,也存储value
    所以范围查找的速度是非常的高的

    2、MyISAM与InnoDB的区别?

    (1) innodb存储文件有frm、ibd 是数据文件(共享表空间和单独表空间)而myisam是frm、myd(数据文件)、myi(索引文件)
    myisam比innodb快
    (2)innodb是聚集索引,使用B+Tree作为索引结构, 数据额文件是和(主键)索引绑定在一起的
    (表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大。其他索引也会很大。
    MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

       也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
    
    • 1

    3、使用索引原则:

    回表

    概念:从非聚簇索引跳转到聚簇索引中查找数据的过程中称之为回表
    看下表的表2,当执行下面SQL语句的时候,因为查询的是*,所以会回表表1
    select * from table where name=?

    索引覆盖(推荐使用)

    概念:当非聚簇索引的叶子节点中包含了查询需要的所有字段时,不需要回表,这个过程称之为索引覆盖
    下面的SQL不需要回表
    select name from table where name=?

    索引下推

    select * from table where name=? and age=? 在没有索引下推之前,执行的过程时,先根据
    name 从存储引擎中拉取数据,然后根据age在server中过滤
    有了索引下推之后,执行的过程是:根据name,age整体的从存储引擎中做数据检索,返回对应的记录,不再server层做任何操作
    https://juejin.cn/post/7005794550862053412

    最左前缀匹配原则

    表字段 id name age gender (id是主键,name,age是普通索引,组合索引)
    select * from table where name=? and age=?
    select * from table where name=?
    select * from table where age=?
    select * from table where age=? and name=? 优化器会优化
    其中只有第三个用不了组合索引
    index(abc)
    where a>10 and b=1 and c=1
    where a>10 and b=1 and c=1

    4、聚簇索引和非聚簇索引的区别

    聚簇索引不是一种单独的索引类型,而是一种数据存储方式。将数据存储与索引放到了一块,找到索引也就找到了数据。
    非聚簇索引也叫二级索引,将数据存储与索引分开结构,索引结构的叶子节点指向了数据的对应行地址,通过地址才能找到对应的数据。

    判断数据跟索引是否放在一起的,如果放在一起就是聚簇索引,不放在一起就是非聚簇索引

    注意:在innodb中,数据在进行插入的时候必须要跟某一个索引的值进行绑定,这个值默认是主键,如果没有主键,选择唯一键,如果没有唯一键,选择6字节的rowid
    数据一定跟索引聚集存放-》.frm .ibd

    一个表中可以有多少个索引? N个
    索引如果是跟数据放在一起,那么数据会存储几分? 数据会存储一份
    在这里插入图片描述

    下图是主键的索引结构
    在这里插入图片描述

    下图是Name的建立的索引结构
    在这里插入图片描述

    innodb中,一定有聚簇索引,但是其他索引都是非聚簇索引。
    myisam中只有非聚簇索引(本来就是非开放的)

    5、B+tree

    在这里插入图片描述

  • 相关阅读:
    NLP论文解读:无需模板且高效的语言微调模型(上)
    Linux---(四)权限
    coco.py文件详解
    linux 压缩命令
    文本分类微调技巧实战2.0
    广度优先(BFS)(例子:迷宫)
    [附源码]Python计算机毕业设计宠物寄养管理系统
    [环境配置]anaconda3的base环境与python版本对应关系表
    MATLAB使用速成 第三章(MATLAB绘图)
    MySQL 索引及查询优化总结
  • 原文地址:https://blog.csdn.net/MyxZxd/article/details/126810030