zoukankan      html  css  js  c++  java
  • 关于数据库的索引

    1 什么是索引

    索引是原始表之外额外的一种数据结构。最简单的理解,比如使用二分查找来对单列索引,那么这样的索引就是对该列进行排序,排序好之后,每个结点有一个该列所对应的行的行号。这样在对该列进行查找的时候,先进行二分查找,即lg复杂度,就找到了该列的结点,进而找到该列对应的行号,然后就从表中获取到了该行了。

    二分查找存在不平衡的问题,另外因为索引也要访问外存,对io次数也有要求,因此索引一般使用B+树,因为B+树的数据是放在叶子结点的,不需要将索引文件全部读入内存中,可以节省内存占用。

    也不一定就索引和原始表分开,innodb的话,就是一体的,原始表的数据直接保存在叶子结点,myisam是分开的。

    2 索引加快查询速度的原理

    二分查找将线性查找复杂度变成了lg复杂度。

    3 索引的缺点

    索引需要额外的磁盘空间,但是索引所占的磁盘空间比原始表要小得多,因为地址一般是4个字节的,而原始表中的一行数据一般都是很大的。

    更新表,也要更新索引文件本身,这样更新操作需要更多的时间。

    4 数据库领域里面的各种常见的索引

    B+ tree,Hash等,这个地方还需要进一步研究。

    5 B+树索引

    这里先考虑单列索引,对需要建立索引的列,创建一棵B+树。这样查找的时候,时间复杂度就是lg了。

    B+树索引本质上是索引列的排序,因此也比较适合于范围查找。

    多列索引也是一颗B+树。

    6 hash索引

    hash索引本质上就是使用一个hash函数将需要建立索引的列散列到不同的桶中,如果有冲突在桶中再进行第二次查找即可。 

    hash索引不适合于范围查找。

    7 多列索引的原理

    多列索引是一种前缀索引,也就是说,查找的时候,只要查询条件是多列索引的前缀,那么该索引就是起作用的。

    比如索引(a, b, c), 

    where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
    where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
    where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
    where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关

    多列索引也是一棵B+树?如何实现的?

    是的,多列索引也是一棵B+树。 

    多列索引的实现?

    8 B+树和红黑树的区别

    红黑树是一种内存数据结构,B+树是一种更适合磁盘的数据结构,B+树的数据都放在叶子结点。

    无论是B+树还是红黑树都是相对于一个key而言的,即相对于某一列而言的。

  • 相关阅读:
    Spring&AOP&JDK和Cglib动态代理&AspectJ进行AOP开发(XML方式)
    python 切换工作目录
    python 布隆过滤器
    python sys.path.append()
    python encrypt 实现AES加密
    python 魔术方法
    python re匹配中文和非中文
    python 文件整理 shutil
    python定时任务框架
    mac 系统修改环境变量
  • 原文地址:https://www.cnblogs.com/hustdc/p/10179069.html
Copyright © 2011-2022 走看看