• MySQL的索引原理


    查询的历程

    线性查找
    HASH:冗余的数组实现的,查询快,但占用空间
    B+树和二叉树有什么区别
    二叉树:插入和查询很快(logn),无法存大规模数据,复杂度退化(二叉树是n个节点的有限集)
    平衡树:解决bst退化的问题,树是平衡的;节点非常多的时候,依然树高很高
    多路查找树:一个父亲多个孩子节点(度);节点过多树高不会特别深
    多路平衡查找树:B-Tree(构建索引的底层结构)

    阶数

    二叉树中阶数的概念:
    二叉树的阶数是一个节点的子节点数目的最大值
    Tips:度和阶数在定义层面上不同,但实际的数值有可能相同(一般都相同),度是从某一节点去做的定义。阶是从B树做的整体定义。

    为什么使用B+树作为索引的底层结构

    B+树是B-Tree的变形(B+树叶子节点存储数据,更加矮胖)
    只在叶子节点带有指向记录,叶子节点存储数据,非叶子节点可以有更多的孩子节点,更加矮胖(阶数更多或者度更多)

    阶数不能越多越好

    阶不能越多越好,内存管理单位是以页,阶是以磁盘块的大小来决定的。
    为了操作系统更好的缓存和读取数据,所以阶数不可以越多越好。

    什么时候用索引

    经常出现在order by group by 之后的字段
    非空字段NOT NULL,Mysql很难对空值作查询优化(一般都需要有默认值)
    区分度高,离散度大,作为索引的字段值尽量不要有大量相同值

    使用索引的注意事项

    索引一般使用的是索引是id,也就是自增的Int值,若是字符串的化一定要指定长度(不要太长),不然就会很耗费时间。(索引的值作为Key存在的,太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率),

    索引什么时候失效:

    以%开头的LIKE语句,模糊搜索
    模糊匹配、类型隐式转换(Python动态语言查询中需注意)
    没有满足最左前缀(没有办法直接比较)
    原因:
    Mysql B+树的key无法比较的时候就失效

    聚集索引,非聚集索引

    聚集还是非聚集指的是B+Tree叶子节点存的是指针还是数据记录;没有存储数据非聚集(非聚集存储的是指定(数据记录的地址))
    MyISAM索引和数据分离,使用的是非聚集索引
    InnoDB数据文件就是索引文件,主键索引就是聚集索引

  • 相关阅读:
    从原理层面掌握@InitBinder的使用【享学Spring MVC】
    array详解
    forward_list详解
    list详解
    deque详解
    vector详讲(三)实例
    vector详讲(二)迭代器
    vector详讲(一)
    numeric_limits<>函数
    seek()和tell()在文件里转移
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/16180490.html
Copyright © 2020-2023  润新知