標籤:記錄 物理 預設 sql 完全 clust 優點 限制 資料
叢集索引一個表只能有一個,而非叢集索引一個表可以存在多個。
叢集索引儲存記錄是物理上連續存在,而非叢集索引是邏輯上的連續,實體儲存體並不連續。
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使用。