zoukankan      html  css  js  c++  java
  • 索引

    为什么要有索引?

    如果一张数据库表只有区区几千,几百条记录,那不必创建索引,因为索引也会占用内存空间,但是,当一张表有百万条记录时,当需要查询一个数据时(而且实际情况是对于一张数据库表的大部分操作都是查询),

    如果没有索引,就需要一条一条数据进行比较,耗费大量时间。比如查字典的是时候我们一般都不会直接查,而是利用目录进行快速定位,索引也是这个意思。

    索引的数据结构:

    索引的数据结构是一颗b+tree,树中的非叶子结点存的是一条记录中的某个字段,叶子结点存放记录值(不一定是一整条记录),

     如图,若要查询的数据是21,先从根节点出发,根节点作为一个磁盘块,一次性加载到内存中,如何对其中的数据进行二分查找,因为21<59,所以向左继续查找,之后同理查询,知道叶子结点。

    在这个过程中,将叶子节点加载到内存中是最耗费时间的(磁盘IO操作),在内存中进行的二分查找节点中的值可以忽略不计。因此,b+树的查询效率取决于树的高度。

    如何能将b+tree的高度降低?

     b+tree的每一个节点(磁盘块)的大小是固定的,因此同样的数据量想要用更矮的b+tree存储,就得想办法减小存入的每一个数据的大小,是的每一个节点能存下更多的字段,

    然而存入叶子节点字段的大小不能改变,就想办法减小存入非叶子节点的字段的大小,因此索引字段一般为int。

    还得尽量选择区分度高的字段做索引,若区分度太低,如性别,b+树将会退化为线性的树。

    若选用自增的字段作为索引字段,还可以减少因重构b+tree所消耗的资源(时间资源,CPU资源) 

    索引分类:

    1.聚集索引:由主键作为索引字段的b+tree,叶子结点存放了每一个字段所对应的一整条记录信息

    2.辅助索引:非主键作为索引字段的b+tree,叶子结点只存放了索引字段和其对应的主键信息,查询一条记录的信息,先在使用辅助索引查询到对应主键信息,之后再使用聚集索引进行查询;

    若需要查询的信息就是主键,则只需要是使用辅助索引进行查询,无需再次使用聚集索引查询。

    MySQL中常见索引:

    普通索引INDEX:加速查找

    唯一索引:

      -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)

      -唯一索引UNIQUE:加速查找+约束(不能重复)

    联合索引:

      -PRIMARY KEY(id,name):联合主键索引

      -UNIQUE(id,name):联合唯一索引

      -INDEX(id,name):联合普通索引

    优秀文章:

    https://www.cnblogs.com/fengqiang626/archive/2019/09/04/11459434.html

  • 相关阅读:
    python通过标准输入读取内容,读取键盘输入的内容?接收用户输入?
    Centos修改时间显示的时区,将UTC修改为CST
    python中注释的写法
    python中,数字类型计算
    python中,获取字符串的长度
    python中的字符串常量,是否支持通过下标的方式赋值
    python,如何获取字符串中的子字符串,部分字符串
    python中是否有单独的字符类型,通过下标的方式表示字符串中的字符
    python中,如何将两个变量值进行拼接
    python中,如有个非常长的字符串,在写的时候如何将其分隔
  • 原文地址:https://www.cnblogs.com/yu-xia-zheng-ye/p/13583263.html
Copyright © 2011-2022 走看看