資料庫索引以及exists,in的學習

2021-06-21 06:28:47 字數 910 閱讀 7281

本文分為兩個部分,第一部分是談聚簇索引和非聚簇索引,第二部分談sql中exists和in的用法

第一部分

首先這兩個都是索引,索引一般用在表中某些需要頻繁讀取的字段上,這是考慮到對錶的寫操作時要同時更新這些索引,有效能損耗。

聚簇索引:如果有n條資料,就有n個索引項,以b+樹方式存在磁碟上。葉子節點存放的是所有實際的資料,這些資料同時是物理連續的。可以在logn的時間內找到結果,同時也可以按序遍歷(不使用索引)。但在插入刪除時,如果填充因子設定的太大(100%)時,可能會進行大量資料的磁碟移動。

非聚簇索引:和聚簇類似,不過葉節點存放的是所有實際資料的id和它的指標。因此它的缺點是當訪問資料時,要比聚簇索引方式多查詢一次(多一次通過指標查詢到資料的實際位置)。但是由於是指標,所以它的實際資料可以分散的儲存到硬碟的各個位置,同時更新操作時只要移動id和相應的指標就行了,不用移動實際資料。

參考:

第二部分

首先說in和exists的用法

in:可以使用where id in(……)的方式,後面接的是乙個查詢結果,類似乙個集合,例如select id…或者(1,2,3),返回的也是乙個集合。

exists:可以使用where exists(……)或者and exists(……)的方式,只要括號裡返回結果不為空,exists就返回true,否則為false。

這兩個都是子查詢,不過對於in,是先執行in子句,然後再和主查詢鏈結,得到查詢結果。

對於exists,先執行主查詢,然後對每條查詢記錄,在exists中判斷是否為true,如果是true則保留這條記錄,否則捨棄這條資料,最後返回整個查詢結果。

總結:對於主查詢裡的為表a,子查詢裡的表為b。當子查詢表b小時,用in比較好,因為先執行b可以減少比較次數(這裡可能不是很對,但大概就是這意思)。當主查詢表a小時,用exists比較好。

參考:

資料庫建立索引以及索引失效問題

運算元據庫索引能起到優化資料庫查詢,提高查詢效率的作用。並且對也稍微大一點的資料量的服務來說,索引的建立是必須的,也是關鍵的。但是索引也要合理應用,不要遇到查詢就建索引,也不能亂建。如果造成索引失效那還不如不建。索引失效有的時候是因為自己的語句問題造成的。下面是幾種造成索引失效的幾種原因,一 以下的...

資料庫的優化之建立索引,以及SQL

在資料庫中,索引的含義與日常意義上的 索引 一詞並無多大區別 想想小時候查字典 它是用於提高資料庫表資料訪問速度的資料庫物件。a 索引可以避免全表掃瞄。多數查詢可以僅掃瞄少量索引頁及資料頁,而不是遍歷所有資料頁。b 對於非聚集索引,有些查詢甚至可以不訪問資料頁。c 聚集索引可以避免資料插入操作集中於...

校招資料庫知識整理(索引以及事務)

設計表結構的時候會用到。面試中一般不會涉及 索引是對資料庫表中乙個或多個列的值進行排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b tree及其變種。索引加速了資料訪問,因為儲存引擎不會再去掃瞄整張表得到需要的資料 相反,它從根節點開始,根節點儲存了子節點的指標,儲存引擎會根...