索引

作者: 垂直居中的句号 | 来源:发表于2021-05-26 18:22 被阅读0次

    索引相当于一个目录,占用一定的存储空间,方便快速查找数据,没有索引的话查询会遍历所有数据。
    将无序的数据有序存储。hash的话会将数据的hash值按顺序存储。 Btree的话会将数据的地址按顺序存储。

    1. 把创建了索引的列的内容进行排序
      2.对排序结果生成倒排表
      3.在倒排表内容上拼上数据地址链
      4.查询的时候,先拿到倒排表的内容,再取出数据地址链,从而拿到具体数据。

    聚簇索引和非聚簇索引
    都是使用了B+树
    聚簇索引:将数据存储和索引放到一块,并且按照一定的顺序组织的,找到索引就找到了数据,数据的物理存放顺序和索引顺序是一致的。
    非聚簇索引
    叶子节点不存储数据,索引存储的是数据行的地址,根据索引查找数据行的位置,之后再去磁盘上查找数据。
    类似一本书的目录。

    优点: 1.非聚簇索引需要二次查找,聚簇索引的查找效率高。

    1. 聚簇索引对于范围查询和排序的场合效率很高。

    劣势

    1. 维护索引很昂贵。特别是插入行,主键被修改导致分页的时候,建议在大量的插入新行后,选择在负载较低的时间段,通过OPTIMIZE TABLE 优化表,因为移动行数据可能会造成碎片,使用独享表空间可以弱化碎片。
      2.表使用UUID作为主键会使数据存储稀疏,会出现聚簇索引比全表扫描更慢。
      3.如果主键比较大的话,辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值,过长的主键值,会导致非叶子节点占用更多的物理空间。
      InnoDB 中一定有主键,主键是聚簇索引,会使用unique索引,没有unique索引会使用一个隐藏的id来当作主键索引,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据都是二次查找。非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。辅助索引叶子节点存储的不再是存储位置,而是主键值。

    myism 使用的是非聚簇索引,没有聚簇索引,有两颗B+树,主键索引B+树的节点存储的主键,辅助索引B+树存储的辅助键。叶子节点两颗树使用了一个地址指向真正的表数据。

    mysql的数据结构
    innodb 默认是B+树索引。hash索引,底层的数据结构是哈希表,绝大多数数需求为单条记录查询,选择哈希索引,查询性能最快;其余大部分场景,建议选择B+索引。

    B+树 : 平衡多叉树 , 根节点到每个叶子节点的距离差不超过1,同层级的节点间有指针相互连接。适合范围查找。
    哈希索引: 将键值换算成hash值, 和对应的数据存储地址,存到hash表中,不需要像B+树那样从根节点到叶子节点逐层查找,可以一次hash直接点位到相应的位置。适应于等值查询。不支持联合索引

    b树是一个二叉搜索树,父节点只有子节点。非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;如果左右子树节点数量差不多就逼近二分查找,二分查找是连续的内存空间,改变B数的结构不需要移动大段的内存数据。

    B-数 是多路搜索树。不是二叉,但是基于二叉结构。包括根节点,叶子节点,分支节点。
    根节点:一个B树索引只有一个根节点,他实际就是位于树的最顶端的分支节点。
    分支节点:包含的条目指向索引里其他的分支节点或者叶子节点。
    叶子节点:包含的条目直接指向表里的数据行。

    索引的设计原则
    1.where字句需要查询的列
    2.数据量较少的表
    3.使用短索引
    4.不要过度索引
    5.定义外键的数据列一定要建立索引。
    6.更新频繁的字段不适合创建索引
    7.若不能有效区分数据(如男女)的列不适合做索引列。
    8.尽量扩展索引,不要新建索引。
    9.重复值较多,查询涉及列较少的不要建索引
    10.对于定义text /image 和bit数据类型的列不要建立索引。

    mysql 锁的类型
    基于锁的属性分类:共享锁、排他锁
    基于锁的粒度分类:

    相关文章

      网友评论

          本文标题:索引

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