--但是索引本質到底是什麼? --百度百科: --索引是為了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對錶而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。 --在資料庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除 ...
--前提代碼: --創建資料庫 create database UsersDBTest --sqlserver這一句話就可以創建資料庫,其它按預設值創建。 --創建表 create table UserInfo ( ID int identity(1,1) not null, Uname nvarchar(max) not null, Pwd nvarchar(max) not null, ShowName nvarchar(max) null, ); --代碼創建主鍵 Alter table UserInfo add constraint PK_UserInfo --給主鍵約束取別名,寓意:UserInfo表的主鍵約束。取別名的好處是1刪除方便2為多個列定義同時約束,即主鍵組。 Primary Key (ID Asc); --主鍵約束 ,根據ID升序排序 --但是刷新表後發現 索引項多了 PK_UserInfo ---sqlserver自動對主鍵列創建了聚集索引(補充:主鍵預設是唯一的所以也是唯一索引) --相當於 Alter table UserInfo add constraint PK_UserInfo Primary Key Clustered (ID Asc); --問題:1能不能把建立索引與主鍵分離,然後單獨對添加、修改和刪除索引? --百度得: --添加索引:CREATE INDEX 索引名稱 ON 表名(列) --刪除索引:drop index 索引名稱 on 表名 --查尋索引: select * from sys.indexes where name='索引名稱'; --並沒發現直接修改索引的語法,那就先刪除再添加吧。 --drop Index PK_UserInfo On UserInfo --報錯:不允許對索引 'UserInfo.PK_UserInfo' 顯式地使用 DROP INDEX。該索引正用於 PRIMARY KEY 約束的強制執行。 alter table UserInfo drop constraint PK_UserInfo --結果:聚集索引沒了,但主鍵約束也沒來。 --單獨建立UserInfo表索引列和索引類型 create Index IX_UserInfo On UserInfo(ID); --為了好區分,IX_UserInfo是我為索引取的別名。 --結果:不唯一,非聚集索引 Alter table UserInfo add constraint PK_UserInfo Primary Key (ID Asc); --重建主鍵約束,結果:預設又為主鍵創建了聚集索引! --刪除IX_UserInfo drop Index IX_UserInfo On UserInfo --為什麼對於自己創建的索引,顯式刪除有效,對系統預設創建索引的就無效。。 --問題2:如何取消主鍵自動創建索引??? --方案一 -- 1. 首先刪除主鍵, 然後重新創建主鍵, Alter table UserInfo drop constraint PK_UserInfo --2重新創建主鍵的時候, 需要說明本主鍵是使用 非聚集索引 Alter table UserInfo add constraint PK_UserInfo Primary Key NonClustered (ID); --3為需要聚集索引的列創建聚集索引 Create Clustered Index IX_UserInfo_UName on UserInfo (UName); --4想加唯一約束,滑鼠卻刪不掉,代碼刪除 Drop index IX_RoleInfo_UName on UserInfo; Create Unique Clustered Index IX_UserInfo_UName on UserInfo (UName); --查詢索引:刷新表後查看索引項,或者代碼查看 select * from sys.indexes where name='IX_UserInfo_UName'; --方案二 ------設置非主鍵為聚集索引【4步】 --1. 查看所有的索引,預設情況下主鍵上都會建立聚集索引 sp_helpindex UserInfo -- 2. --刪除主鍵約束,從而刪除主鍵上的索引約束。 alter table UserInfo drop constraint PK_UserInfo -- 3.--創建聚集索引到其它列 create Clustered Index IX_UserInfo_UName on UserInfo (UName); -- 4.—修改原來的主鍵欄位還是為主鍵,此時會自動建立非聚集索引【一張表聚集索引只能有一個】 alter table UserInfo add primary key (ID) --如果想自定義名稱 Alter table UserInfo add constraint PK_UserInfo Primary Key(ID); --最終結論:兩種方案大同小異,只能把主鍵改為非聚集索引,但是會有索引。 --不過把聚集索引的位置騰出來了(一張表只能創建一個聚集索引)。
--但是索引本質到底是什麼?
--百度百科:
--索引是為了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對錶而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。
--在資料庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關係圖時,索引將保存在資料庫中。
--當表中有大量記錄時,若要對錶進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作; --第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
--註意創建索引也需要時間和計算量,一般只用於經常需要訪問的列。
--聚集索引:物理存儲順序與邏輯順序一致,線性結構(一條直線)。
--非聚集索引:物理存儲順序與邏輯順序不一致:樹狀(多條分支)。
--其他資料:
-- http://blog.csdn.net/kennyrose/article/details/7532032
-- http://outofmemory.cn/mysql/mysql-index-and-slow-query#6762184-tsina-1-89901-3400cac556b7c64aaad138f696c2c997
--額,還是不太懂。。