获取原始数据运算符的比喻
场景:假设我们班级的N个同学分别坐在一个大型礼堂的不同座位上,每个同学的学号就相当于他们的座位号(无序)。我们要找到学号为n-1的同学。
工具:名单册(学号,姓名)
查找速度排序(从慢到快)
-
全表扫描(Table scan):就像你什么也不知道,只能一个个的去找(遍历整个数据库,O(N))
-
索引查找(Index Seek): 假设有一个按照学号顺序(逻辑顺序)排列的同学名单册(即非聚集索引),你可以直接翻到名单册中间,然后使用二分查找就可以快速定位,而不需要去礼堂一个一个看座位号,(省去了I/O时间,因为只用查看索引,时间复杂度log2N)
-
键查找(Key Lookup):在使用索引查找之后,你已经知道了同学的姓名,你只需要回礼堂(全表)去寻找即可,是在已经缩小查找范围下的查找,所以更快,这是额外的操作,会增加一些开销
-
聚集索引查找(Clustered Index Seek):如果同学们坐的位置是根据名单册(名单册的顺序和座位的顺序一样(物理顺序),即聚集索引)坐的,且他的座位号在相邻的信息中,你就可以直接得到座位号,你就可以直接找到他
-
非聚集索引查找(Index Seek):与索引查找相同,只是特指索引是非聚集索引,还是需要通过键查找
-
非聚集索引扫描(Index Scan):与全表扫描类似,只是他扫描的是索引树(名单册)
-
聚集索引扫描(Clustered Index Scan):你有一个名单册(物理顺序),但是因为你要找的人不止一个特别多,所以在这种情况下你会直接扫描,而不是查找
总结,从快到慢:
-
全表扫描
-
非聚集索引扫描
-
聚集索引扫描
-
索引扫描++键查找
-
非聚集索引查找
-
聚集索引查找