一.索引原理:
為認識索引工作原理,首先有必要對資料表的基本結構作一次全面的複習。
當乙個新錶被建立之時,系統將在磁碟中分配一段以8k為單位的連續空間,當字段的值從記憶體寫入磁碟時,就在這一既定空間隨機儲存,當乙個8k用完的時候,sqls指標會自動分配乙個8k的空間。這裡,每個8k空間被稱為乙個資料頁(page),又名頁面或資料頁面,並分配從0-7的頁號,每個檔案的第0頁記錄引導資訊,叫檔案頭(file header);每8個資料頁(64k)的組合形成擴充套件區(extent),稱為擴充套件。全部資料頁的組合形成堆(heap)。
sqls規定行不能跨越資料頁,所以,每行記錄的最大資料量只能為8k。這就是char和varchar這兩種字串型別容量要限制在8k以內的原因,儲存超過8k的資料應使用text型別,實際上,text型別的字段值不能直接錄入和儲存,它只是儲存乙個指標,指向由若干8k的文字資料頁所組成的擴充套件區,真正的資料正是放在這些資料頁中。
頁面有空間頁面和資料頁面之分。
當乙個擴充套件區的8個資料頁中既包含了空間頁面又包括了資料或索引頁面時,稱為混合擴充套件(mixed extent),每張表都以混合擴充套件開始;反之,稱為一致擴充套件(uniform extent),專門儲存資料及索引資訊。
表被建立之時,sqls在混合擴充套件中為其分配至少乙個資料頁面,隨著資料量的增長,sqls可即時在混合擴充套件中分配出7個頁面,當資料超過8個頁面時,則從一致擴充套件中分配資料頁面。
空間頁面專門負責資料空間的分配和管理,包括:pfs頁面(page free space):記錄乙個頁面是否已分配、位於混合擴充套件還是一致擴充套件以及頁面上還有多少可用空間等資訊;gam頁面(global allocation map)和sgam頁面(secodary global allocation map):用來記錄空閒的擴充套件或含有空閒頁面的混合擴充套件的位置。sqls綜合利用這三種型別的頁面檔案在必要時為資料表建立新空間;
實際上,您可以把索引理解為一種特殊的目錄。微軟的sql server提供了兩種索引:
1.聚集索引
其實,我們的漢語字典的正文本身就是乙個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an.
字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。
我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。
2.非聚集索引
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方
法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首
目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁
碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分
別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引
中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。
我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。
通過以上例子,我們可以理解到什麼是「聚集索引」和「非聚集索引」。
二。例項分析:
下面我們就來看一下在200萬條資料量的情況下各種查詢的速度表現(以25萬條資料為例說明)
create database index_test1 --建立測試用的索引資料庫
gouse index_test1
gocreate table indextable1
(gid int identity(1,1) primary key,
data datetime,
creater varchar(100) not null,
title varchar(100) not null, )
--插入資料
declare @i int
set @i=1
while @i<=2000000
begin
insert into indextable1(data,creater,title) values(dateadd(day, @i, getdate()),'mfm','這是測試索引的例子')
set @i=@i+1
end
--預設情況下查詢前250000條資料的時間
declare @timediff datetime
select @timediff=getdate()
select top 250000 * from indextable1
select datediff(ms,@timediff,getdate()) as 耗時
--在主鍵上建立聚集索引,在data上建立非聚集索引(非常慢)
create clustered index gid_index on indextable1(data)
--也可以利用以下方法修改主健為非聚集索引
alter table indextable1 add constraint pk_dr primary key nonclustered(gid)
--刪除已存在的索引
drop index indextable1.gid_index
經過測試,總結如下:
1.在預設情況下,即以gid為主健時,系統自動生成聚集索引,查詢25w資料花了3382ms
2.以gid為主健聚集索引,data建立為非聚集索引時,查詢25w資料花了5586ms
3.取消主健取集索引,建立data為取集索引時,查詢25w資料花了2274ms
本人機器配置是:本本迅弛雙核1.6g,512m記憶體,獨顯128m,大家可以按照以上方法去一一測試。
mysql 索引 實現 MySQL索引原理及實現
主要內容 索引本質 mysql索引實現 前言索引是儲存引擎快速查詢記錄的一種資料結構,它對於效能非常關鍵,尤其是對於表資料量較大的情況,索引對效能的影響愈發重要。所以了解索引對於效能優化極其重要。索引本質 mysql儲存引擎使用索引的方法,類似於讀一本書時如果想查詢特定的主題的話,需要先看書的目錄,...
CJCMS系列 說說專案中如何使用搜尋引擎
開源全文搜尋引擎,比較火的當屬lucene.net。lucene.net是 lucene 的.net移植版本,是乙個開源的全文檢索引擎開發包,即它不是乙個完整的全文檢索引擎,而是乙個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎。開發人員可以基於lucene.net實現全文檢索的功能。比較麻煩的...
索引優化及原理
oracle 之sql優化 索引的基本原理 一 1 索引的基本概念 1 建立索引的目的 以索引小的io換取表的大io。何時建立索引 當訪問的資料塊少於表中20 的資料時,建議使用索引。2 索引的 會使insert delete速度變慢 索引個數多的話速度就會慢 對於update語句,需要先判斷是否要...