為什么要建立索引?


 我們拿詞典做了例子:

1、詞典前面的拼音目錄-----》聚集索引

2、詞典前面的部首目錄-----》非聚集索引

3、詞典正文(意思是去掉拼音和部首目錄)-----》數據表的物理存儲

 

以SqlServer為例:有一張表,表結構如下:

1、不建立主鍵的情況下:插入幾條記錄(這個情況下相當於一個詞典的正文沒有按照拼音進行排序,是亂放的)

INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (6, N'docker', CAST(0x000082E600000000 AS DateTime))
INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (7, N'empty', CAST(0x000082E600000000 AS DateTime))
INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (8, N'fifth', CAST(0x000082E600000000 AS DateTime))
INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (9, N'zoo', CAST(0x000082E600000000 AS DateTime))
INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (1, N'Allen', CAST(0x0000817900000000 AS DateTime)) INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (2, N'Andy', CAST(0x000082E600000000 AS DateTime)) INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (3, N'bob', CAST(0x000082E600000000 AS DateTime)) INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (4, N'bily', CAST(0x000082E600000000 AS DateTime)) INSERT [dbo].[Student] ([SID], [SName], [SBirthday]) VALUES (5, N'cindy', CAST(0x000082E600000000 AS DateTime))

執行sql語句:select * from Student  ---  沒有排序字段,查詢出的就是數據物理存儲到數據頁中的順序:

 

這個順序呢就是按照你記錄添加進的順序。

再看“查詢分析器”:執行了“表掃描”,就是去查詢整個物理表了,這里演示的數據少,無所謂,如果是幾千萬條,就要花費很久的時間了。

 

 

2、建立主鍵。--建立主鍵后,數據庫會自動創建一個“聚集索引”,作用呢,就是把物理存儲順序按照聚集索引的數序重新排列一遍。

 

然后,我們重新查詢一遍:select * from Student

 

結果變了,按照順序進行了重新存儲。

 並且,看“查詢分析器”:走的是聚集索引掃描。---->聚集索引就是個文件,里面放的就是對應關系(相當於詞典前面的拼音目錄)

3、建立“非聚集索引”。

 

執行查詢:select * from Student where sname='docker'

查詢分析器:

 

還是走的聚集索引,這是為什么呢?為什么沒有走非聚集索引呢??----非聚集索引中的臨界點(Tipping Point)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM