zoukankan      html  css  js  c++  java
  • ORM之聚合索引

    Django中的聚合索引

    专业来说可以把索引理解为一种特殊的目录。而微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别: 

        其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查"安"字,就会很自然地翻开字典的前几页,

    因为"安"的拼音是"an",而按照拼音排序 汉字的字典是以英文字母"a"开头并以"z"结尾的,那么"安"字就自然地排在字典的前部。

    如果您翻完了所有以"a"开头的部分仍然找不到这个字,那么就 说明您的字典中没有这个字;同样的,如果查"张"字,

    那您也会将您的字典翻到最后部分,因为"张"的拼音是"zhang"。也就是说,字典的正文部分本身 就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

      我们把这种正文内容本身就是一种按照一定规则排列的目录称为"聚集索引"

    如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,

    这时候,您就不能按照刚才的方法找到您要查的字,而 需要去根据"偏旁部首"查到您要找的字,

    然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合"部首目录"和"检字表"

    而查到的字的排序并不是 真正的正文的排序方法,比如您查"张"字,我们可以看到在查部首之后的检字表中"张"的页码是672页,

    检字表中"张"的上面是"驰"字,但页码却是63 页,"张"的下面是"弩"字,页面是390页。很显然,这些字并不是真正的分别位于"张"字的上下方,

    现在您看到的连续的"驰、张、弩"三字实际上就是他 们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。

    我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后 再翻到您所需要的页码。

    Django的元类建索引————索引:而索引的一个主要目的就是加快检索表中数据,索引是经过某种算法优化过的,因而查找次数要少的多。因此,索引是用来定位的。

    如下:

    Django(元信息)元类建索引

    class Book(models.Model)
        name = models.CharField(max_length=64)
     
        class Meta:
            # 自定义表名
            db_table = 'table_name'
            # 联合索引: 索引的一个主要目的就是加快检索表中数据
            index_together = ('tag1', 'tag2')
            # 联合唯一索引:两个字段全部重复才算重复
            unique_together = ('tag3', 'tag4')
            # 排序字段
            ordering = 'ordering_tag'
            # /admin/中显示的表名称
            verbose_name = 'table_name'
      

    而两种索引的作用,套用上面所举的例子形容如下:

    聚集索引

    这一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 
    聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。

    由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。

    但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 
         
         聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行 的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此 类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节 省成本。     

    当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。

    非聚集索引

    这一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

    索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。

    而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/xuedine/p/11814981.html
Copyright © 2011-2022 走看看