• Jerry银银
    2019-01-21
    我对索引的理解
    ------------
    索引真是个好东西。索引的英文名字叫:index,记住这个英文单词,会让我们更容易记忆和联想它到底是什么。在实际的编程中,index这个单词,真是到处可见。例如:数组的下标就是index

    如果用一句话描述“索引”的作用,那会是什么?我想是这样:索引是用来辅助查找,用计算机专业术语叫:Addressing(寻址)

    现实世界中,我们的查找会存在两种场景:
    1. 从局部信息,查询与其相关的整体信息
    2. 从整体信息中查询局部信息
    怎么理解呢?
    搜索引擎需要查询一个网页中是否存在某个关键词以及通过某个关键词查询包含它的所有网页。

    索引的应用
    --------
    正是因为计算机大部分工作都是在Addressing,所以,在计算机中,索引到处存在。小到操作系统虚拟内存到真实内存的映射,就是索引嘛,大到分布式系统、网络,都是这个原理。

    以上,我对索引的理解有点“广义”。我觉得数据结构和算法如此重要,它体现计算机精髓的地方便在于此。




    展开
     1
     53
  • freeland
    2019-01-21
    es中的单排索引其实用了trie树,对每个需要索引的key维护了一个trie树,用于定位到这个key在文件中的位置, 然后直接用有序列表直接去访问对应的documents ,区块链拿以太坊来说吧,存储用的leveldb,数据存储用的数据结构是帕特利夏树,是一种高级的trie树,很好的做了数据的压缩, 消息中间件像kafka这种,会去做持久化,每个partition都会有很多数据,会有大量数据存储在磁盘中,所以每个partition也会有个索引,方便去做快速访问
    
     23
  • 往事随风,顺其自然
    2019-01-22
    可以讲讲es 到排序索引结构原理和数据结构?
    
     7
  • Jerry银银
    2019-01-21
    今天音频朗读帅哥把MySQL读成了 my s q l ,早上起来听音频,萌了\(//∇//)\

    编辑回复: 官方读法就是 S Q L 哈

     1
     7
  • 在路边鼓掌的人
    2019-01-22
    昨天刚学了操作系统的多级页表,应该是比较经典的索引了😂
    
     5
  • one
    2019-01-21
    希望老师能讲讲二级索引(从V查K)这块,一直搞不清楚,没有自己写过。还有空间数据结构的range现在也很火,比如uber,滴滴常用的,面试常考。
    
     5
  • 三木子
    2019-01-21
    everything
     2
     4
  • 万里有云
    2019-04-12
    把数据的关键词(查询用的)抽取出来,组织成有序数组。如果关键词是整型,那索引就是整形数组,关键词是字符串,那索引就是字符串指针数组吗?

    作者回复: 是的

    
     3
  • 海贼王
    2019-11-29
    从评论可以看出能坚持到这里的人不多,不过也不绝对,因为有些坚持到这里的人可能因为某些原因没有发表评论。不过还是很感谢老师的,从这个课程中,我体会到了数据结构的用处。之前有人说数据结构在平常的开发中没有用,当时我表示认同。现在看来,这句话也不完全正确。不同层次的人看问题的思路不同,结果也南辕北辙。
    
     2
  • 无形
    2019-07-05
    最近在用的是倒排索引和roaring bitmap,用在广告检索中简直无敌搬的存在
    
     2
  • aof
    2019-11-02
    HBase在读写过程中用到了跳表、LSM树和布隆过滤器。
    
     1
  • static
    2019-09-16
    课后思考:Kafka的日志偏移量索引文件,时间戳索引文件,用于根据消息的偏移量、时间戳快速找到消息在磁盘中的位置。
    
     1
  • xuery
    2019-04-09
    索引的底层数据结构实现很多,有些时候可以结合使用,比如王争老师说的,查询某个数据是否存在,可以先通过布隆过滤器的不存在的一定不存在判断,在这一层可以拦截掉不存在的数据
    
     1
  • 纯洁的憎恶
    2019-01-21
    理论联系实际,融会贯通。
    
     1
  • 传说中的成大大
    2019-01-21
    这一节就高深了....
    
     1
  • 注定非凡
    2020-02-07
    为什么需要索引?
    (1)在实际的软件开发工作的本质都可以抽象为“对数据的存储和计算”。对应到数据结构和算法中,那“存储”需要的就是数据结构,“计算”需要的就是算法。
    (2)对于存储的需求,功能上无外乎增删改查。当存储的数据很多,性能就会成为这些系统要关注的重点,特别是在存储相关的基础系统、中间件中。
    (3)“如何节省存储空间、如何提高数据增删改查的执行效率”,解决这样的问题离不开索引

    索引的需求定义
    对于系统设计需求,一般可以从功能性需求和非功能性需求两方面来分析
    1. 功能性需求
    (1)数据是格式化数据还是非格式化数据?
    构建索引的原始数据,可分为两类:
        * 一类是结构化数据,如MySQL 中的数据;
        * 一类是非结构化数据,如搜索引擎中网页。非结构化数据,一般需要预处理,提取出查询关键词,对关键词构建索引。

    (2)数据是静态数据还是动态数据?
        * 如果是一组静态数据,在构建索引时只需考虑查询效率
        * 动态数据构建索引,不仅要考虑索引的查询效率,在原始数据更新的同时,还需要动态地更新索引

    (3)索引存储在内存还是硬盘?
        * 当数据量小时,索引可以存储在内存中。
        * 原始数据量很大时,对应的索引可能也会很大。内存有限,可能需要将索引存储在磁盘中。
        * 第三种情况:一部分存储在内存,一部分存储在磁盘,这样可以兼顾内存消耗和查询效率。

    (4)单值查找还是区间查找?
        * 所谓单值查找,也就是根据查询关键词等于某个值的数据。
        * 所谓区间查找,就是查找关键词处于某个区间值的所有数据。不同的应用场景,查询的需求会多种多样。

    (5)单关键词查找还是多关键词组合查找?
        * 对于单关键词的查找,索引构建起来相对简单。
        * 多关键词查询要分多种情况:
              A:像 MySQL 这种结构化数据的查询,可以实现针对多个关键词的组合,建立索引;
              B:像搜索引擎这样的非结构数据的查询,可以针对单个关键词构建索引,然后通过集合操作,如求并集、求交集等,计算出多个关键词组合的查询结果。
    不同的场景,不同的原始数据,对于索引的需求也会千差万别

    2. 非功能性需求
    (1)不管是存储在内存中还是磁盘中,索引对存储空间的消耗不能过大。
        * 如果存储在内存中,索引对占用存储空间的限制就会非常苛刻
        * 如果存储在硬盘中,也不能掉以轻心,因为有时索引对存储空间的消耗会超过原始数据


    (2)在考虑索引查询效率的同时,还要考虑索引的维护成本。
        * 基于动态数据集合构建的索引要考虑索引的维护成本。因为在原始数据动态增删改的同时,也需要动态的更新索引。而索引的更新势必会影响到增删改操作的性能。

    构建索引常用的数据结构有哪些?
    如散列表、红黑树、跳表、B+ 树,除此之外,位图、布隆过滤器可以作为辅助索引,有序数组可以用来对静态数据构建索引

        * 散列表增删改查操作的时间复杂度是 O(1),被一些键值数据库用来构建索引,如 Redis、Memcache。这类索引,一般都构建在内存中。

        * 红黑树是常用的平衡二叉查找树,数据插入、删除、查找的时间复杂度是 O(logn),也非常适合用来构建内存索引。Ext 文件系统中,对磁盘块的索引,用的就是红黑树。

        * B+ 树比起红黑树更加适合构建存储在磁盘中的索引
            (1)B+ 树是一个多叉树,对相同个数的数据构建索引,B+ 树的高度要低于红黑树。
            (2)当借助索引查询数据时,读取 B+ 树索引需要的磁盘 IO 次数会更少。
    所以,如 MySQL、Oracle等,大部分关系型数据库的索引都是用 B+ 树来实现的

        * 跳表也支持快速添加、删除、查找数据,通过调整索引结点个数和数据个数之间的比例,可以很好地平衡索引对内存的消耗及其查询效率。Redis 中的有序集合,就是用跳表来构建的

        * 布隆过滤器有一定的判错率,但可以规避它的短处,发挥它的长处
            (1)尽管对于判定存在的数据可能并不存在,但是对于判定不存在的数据是一定不存在
            (2)布隆过滤器有个大特点:内存占用非常少,所以可以针对数据,构建一个布隆过滤器存储在内存中。
            (3)查询数据时,如果布隆过滤器判定数据不存在,就不必读取磁盘中的索引了。对于数据不存在的情况,数据查询就更加快速了。

        * 有序数组也可以被作为索引,如果数据是静态的只有查询操作,可以把数据的关键词(查询用的)抽取出来,组织成有序数组,然后利用二分查找算法来快速查找数据。

    展开
    
    
  • 万万
    2020-02-01
    老师能分享一下关于分布式算法的网站吗
    
    
  • 失火的夏天
    2020-01-02
    索引是为了快速寻址,这句话说的真好,言简意赅
    
    
  • 退而结网
    2019-12-10
    b+树在进行节点合并和分离时会有随机io问题,但是磁盘寻道需要花费时间,大量的随机io会降低性能,所以出现了lsm树,分割成多棵内存小树,然后超过的部分进行merged到磁盘上,用于平衡红黑树和b+树
    
    
  • 李冲
    2019-09-18
    想起一句不知道谁说的话,有点莫名其妙的感触。

    “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”

    是不是基础体系中的线性编址和寻址已经把模型给固定死了呢?举例来说位图以少代多,散列优化编排,树(跳表)二者兼有,都在一维与线性下转悠。
    
    
我们在线,来聊聊吧