• Clustered Index and NonClustered Index (Correction)


    http://www.cnblogs.com/jinrize/archive/2009/10/29/1592601.html

    教授催论文了,又开始拿起手稿开始写了,涉及到一些细节问题,查看了一下网页,发现这篇文章:http://www.cnblogs.com/zhenyulu/articles/25794.html

    看的有些混乱,可能自己脑子里也没整理好聚簇与非聚簇。现在整理一下。

    按照《数据库系统概念》(Avi Silberschatz)第四版的第十二章节的说明 :

    ”如果包含记录的文件按照某个搜索吗指定的顺序排序,那么该搜索吗对应的索引称为主索引。.... 主索引也称为聚簇索引。.... 那些其搜索码指定的顺序与文件中记录的物理顺序不同的索引称为辅助索引或非聚簇索引“

    和那为博文的作者说法算是一致(在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。)

    不过他接着讲的话有点不对劲:我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块

    叶节点是不是数据节点是看表和索引是分离的还是一起(”一起“?具体术语不记得了)的。和聚不聚簇应该没关系。然后博主画了两张图说明他的说法,这两张图其实是展示了不同的两种索引类型:稠密索引(前一张非聚簇的图),稀疏索引(后一张聚簇索引的图)。

    聚簇索引的物理顺序就是数据的物理存储顺序, 所以没必要对每个搜索吗建立指针,所以聚簇索引可以使稀疏,也可以是稠密索引,但是非聚簇索引的顺序和物理存储顺序不同,必须为每个搜索吗建立指针指向物理地址,即只能是稠密索引。

    也就是说第二张图可以是聚簇的稠密索引结构,那样的话,博主再说:聚簇索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。 就显得不合适了,我看本来这么说就不合适,因为这不是他们的根本区别。

    在“二、索引优化技术”中,博主出了一些计算题让我们做,不过既然是查询一个表的所有记录,那就不会通过索引了,索引是适合在大量数据中随机查找一些数据(一般认为不超过整体数据的2%为好)。如果真的是挨个去查找每个搜索吗的值再去找相应的数据的话,显然也不是1000+10那么简单了!

    在“三、聚簇索引与非聚簇索引的本质区别”中出现的1000+10 和1000+20 就更让我觉得不可思议,我感觉博主是不知不觉地“偷换概念”,16000和8000的两倍关系是B+树和B数索引才会存在的区别,因为在B+树中搜索吗会出现两次,B树中只出现一次。至于聚簇与非聚簇看不出任何一倍两倍的关系。

    说道这里发现那之前的两个图还有一些问题存在,第一张图里AKHTAR在索引结构中出现了三次,第二张图里出现了两次,看来是24000和16000的关系才对哦(当然是玩笑)。

    下面这句也是不知所云了“下面我们看看在执行插入操作时,非聚簇索引的主键为什么比聚簇索引主键要快。主键约束要求主键不能出现重复,那么SQL Server是怎么知道不出现重复的呢?唯一的方法就是检索。对于非聚簇索引,只需要检索20个页面中的16000个节点就知道是否有重复,因为所有主键键值在这16000个索引节点中都包含了。但对于聚簇索引,索引节点仅仅包含了8000个中间节点,至于会不会出现重复必须检索另外1000个页数据节点才知道,那么相当于检索10+1000=1010个页面才知道是否有重复。所以聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。”

    就像我之前说的,聚簇索引也可以是稠密索引。还有这时候的8000个节点咋都变成中间节点(部分节点)了,我以为这个例子中搜索吗只要8000个节点就够了,还查硬盘上的东西干什么? 看看那8000个不就可以确定会不会重复了

    下面的1010和1020也有点太想当然了。

    回复的挺多,盖过30多楼了,肯定的比较多,也有质疑博主的人,我是相当地质疑啊

    当然,对事不对人, 数据库系统是很复杂,就像博主说的尤其是索引和查询优化方面。可能我说的也有不对的地方,或者说干脆我是在笨蛋胡扯。 既然说了人家“坏话”,就不能是“背后”,马上邀博主来聊聊,路过的高手也指点一下。

  • 相关阅读:
    javascript 的原型与原型链的理解
    mysql 复制原理与实践
    mysql 数据库备份的多种方式
    mysql 事务中如果有sql语句出错,会导致自动回滚吗?
    【原】ios下比较完美的单例模式,已验证
    【原/转】ios指令集以及基于指令集的app包压缩策略
    【原】多线程编程中临界区与互斥锁的区别
    【转】Windows的多线程编程,C/C++
    【转】c++中Vector等STL容器的自定义排序
    【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
  • 原文地址:https://www.cnblogs.com/zhangxz/p/2821640.html
Copyright © 2020-2023  润新知