1. 程式人生 > >談聚集索引,非聚集索引及在sqlite使用。

談聚集索引,非聚集索引及在sqlite使用。

dci 時間 strong ger androi 不等式 cluster ble 類型

聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。

聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲並不連續。

create clustered index dcity on city(name) // 創建聚集索引

create unclustered index dcity on city(name) // 創建非聚集索引

先說優點:

  • 大大加快數據的檢索速度,這也是創建索引的最主要的原因
  • 加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
  • 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

再說缺點:

  • 創建索引需要耗費一定的時間,但是問題不大,一般索引只要build一次
  • 索引需要占用物理空間,特別是聚集索引,需要較大的空間
  • 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度,這個是比較大的問題。

索引覆蓋: 索引所存儲的內容就是最終輸出的數據

Sqlite不支持聚集索引,android默認需要一個”_id”字段,這保證了你插入的數據會按“_id”的整數順序插入,這個integer類型的主鍵就會扮演和聚集索引一樣的角色。所以不要再在對於聲明為:INTEGER PRIMARY KEY的主鍵上創建索引。

很多對索引不熟悉的朋友在表中創建了索引,卻發現沒有生效,其實這大多數和我接下來講的有關。對於where子句中出現的列要想索引生效,會有一些限制,這就和前導列有關。所謂前導列,就是在創建復合索引語句的第一列或者連續的多列。比如通過:CREATE INDEX comp_ind ON table1(x, y, z)創建索引,那麽x,xy,xyz都是前導列,而yz,y,z這樣的就不是。下面講的這些,對於其他數據庫或許會有一些小的差別,這裏以sqlite為標準。在where子句中,前導列必須使用等於或者in操作,最右邊的列可以使用不等式,這樣索引才可以完全生效。同時,where子句中的列不需要全建立了索引,但是必須保證建立索引的列之間沒有間隙。

談聚集索引,非聚集索引及在sqlite使用。