為什麼要建立索引?
阿新 • • 發佈:2018-11-01
我們拿詞典做了例子:
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
結果變了,按照順序進行了重新儲存。
並且,看“查詢分析器”:走的是聚集索引掃描。---->聚集索引就是個檔案,裡面放的就是對應關係(相當於詞典前面的拼音目錄)