新聞中心
聚集索引是指數(shù)據(jù)庫(kù)中將主鍵作為索引的方法,它是一種高效的數(shù)據(jù)檢索方式,能夠極大程度上提高數(shù)據(jù)庫(kù)的查詢效率。在大規(guī)模數(shù)據(jù)處理的情況下,采用聚集索引對(duì)于保證數(shù)據(jù)的準(zhǔn)確性和節(jié)約時(shí)間和成本非常重要。

一、聚集索引定義和原理
聚集索引是在創(chuàng)建表時(shí),針對(duì)某個(gè)唯一的鍵值,將整個(gè)表行按照鍵值的大小次序重新組織,也就是說(shuō),整個(gè)表行的順序都被重新排列。在具體的實(shí)現(xiàn)過(guò)程中,聚集索引是采用類似于樹(shù)形結(jié)構(gòu)的方式,將同一聚集索引的所有行分離出來(lái),形成一個(gè)單獨(dú)的樹(shù)形結(jié)構(gòu)。這個(gè)結(jié)構(gòu)中的每個(gè)節(jié)點(diǎn)都包含一行數(shù)據(jù),每個(gè)葉子節(jié)點(diǎn)都包含一個(gè)數(shù)據(jù)行。
在聚集索引中,所有的數(shù)據(jù)行都按照主鍵來(lái)排序,而且只能有一個(gè)聚集索引。這也就意味著,如果在一張表中設(shè)置了聚集索引,那么所有的數(shù)據(jù)行都將按照主鍵排序,每一次查找的時(shí)候,將通過(guò)聚集索引來(lái)搜索數(shù)據(jù),避免了對(duì)于整個(gè)表進(jìn)行掃描和查找,減少了查詢的時(shí)間。而且,聚集索引也能夠使得數(shù)據(jù)的修改和刪除變得更加方便、快捷。
二、聚集索引的優(yōu)缺點(diǎn)
雖然聚集索引說(shuō)起來(lái)很美好,但是它也有自己的優(yōu)缺點(diǎn),讓我們分別來(lái)看看。
1. 優(yōu)點(diǎn)
(1)加速數(shù)據(jù)檢索:搭配主鍵進(jìn)行使用的聚集索引,在數(shù)據(jù)量很大的情況下,能夠大大地提高數(shù)據(jù)檢索的效率。
(2)優(yōu)化查詢:在特定的查詢情況下,聚集索引能夠針對(duì)優(yōu)化查詢執(zhí)行計(jì)劃,減少全表掃描的次數(shù),提高查詢速度。
2. 缺點(diǎn)
(1)不能有重復(fù)主鍵:在聚集索引中,不能出現(xiàn)重復(fù)的主鍵,不然就會(huì)導(dǎo)致聚集索引無(wú)法進(jìn)行排序,從而導(dǎo)致數(shù)據(jù)檢索錯(cuò)誤。
(2)降低寫入性能:聚集索引雖然提高了數(shù)據(jù)檢索的效率,但是在進(jìn)行數(shù)據(jù)寫入的時(shí)候,會(huì)有一定的降低寫入性能,所以在進(jìn)行數(shù)據(jù)寫入的時(shí)候,需要注意一些優(yōu)化策略。
三、聚集索引的應(yīng)用
聚集索引廣泛應(yīng)用于企業(yè)的數(shù)據(jù)庫(kù)系統(tǒng)中,特別是在大規(guī)模數(shù)據(jù)處理時(shí),更是成為了不可或缺的技術(shù)。具體的應(yīng)用如下:
(1) 提升數(shù)據(jù)庫(kù)檢索效率:聚集索引能夠極大程度上提升數(shù)據(jù)庫(kù)的檢索效率,縮短查詢時(shí)間,從而更好地滿足了企業(yè)對(duì)于實(shí)時(shí)性的要求。
(2) 保證數(shù)據(jù)安全:聚集索引能夠保證主鍵不重復(fù),避免了數(shù)據(jù)的冗余,從而更好地保證了數(shù)據(jù)的安全和準(zhǔn)確性。
(3) 提高數(shù)據(jù)處理速度:采用了聚集索引,能夠減少數(shù)據(jù)的掃描和查找,從而更快捷地進(jìn)行大規(guī)模數(shù)據(jù)處理。
四、聚集索引的應(yīng)用實(shí)例
為了更好地說(shuō)明聚集索引的應(yīng)用,下面就以建立博客系統(tǒng)為例,詳細(xì)介紹如何使用聚集索引來(lái)優(yōu)化博客系統(tǒng)。
假設(shè)我們的博客系統(tǒng)中有一個(gè)posts表格,包含字段id、title、content和created_at。
那么我們可以使用以下SQL語(yǔ)句來(lái)創(chuàng)建posts表格:
CREATE TABLE `posts` (
`id` int(11) NOT NULL,
`title` varchar(255) DEFAULT NULL,
`content` text,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
注意,我們?cè)趧?chuàng)建表格的時(shí)候,將id字段設(shè)為主鍵,并使用InnoDB作為引擎。
接著,我們可以使用以下SQL來(lái)添加一個(gè)聚集索引:
ALTER TABLE `posts` ADD INDEX `created_at_index` (`created_at`);
通過(guò)上面的SQL語(yǔ)句,我們?cè)趐osts表格中添加了一個(gè)created_at字段的聚集索引,從而能夠更快速地進(jìn)行created_at的排序和檢索。
五、聚集索引的不足和解決方法
雖然聚集索引能夠提高數(shù)據(jù)的檢索效率,但是它也有一些不足之處,比如在重復(fù)鍵值的問(wèn)題上,沒(méi)有清晰的解決方案。
在實(shí)際操作中,我們可以考慮使用其他的索引組合,比如組合索引、非聚集索引等,從而更好地解決重復(fù)鍵值的問(wèn)題。
六、結(jié)論
聚集索引對(duì)于數(shù)據(jù)快速檢索和大規(guī)模數(shù)據(jù)處理來(lái)說(shuō),是非常重要的一種技術(shù)。它能夠更好地保障企業(yè)的數(shù)據(jù)安全和準(zhǔn)確性,并提高數(shù)據(jù)的檢索效率,從而為企業(yè)帶來(lái)更多的收益和效益。在實(shí)際操作中,我們也需要注意聚集索引的缺點(diǎn)和不足,采用適當(dāng)?shù)膬?yōu)化策略,才能將聚集索引發(fā)揮出更大的作用。
相關(guān)問(wèn)題拓展閱讀:
- 數(shù)據(jù)庫(kù)中聚集索引、非聚集索引、填充因子的概念?
- sql server 怎么建立索引
數(shù)據(jù)庫(kù)中聚集索引、非聚集索引、填充因子的概念?
聚集索引(Clustered Index):對(duì)表的物理數(shù)據(jù)頁(yè)中的數(shù)據(jù)按列進(jìn)行排序亂宏坦,然后再重新存儲(chǔ)到磁盤上,即如果說(shuō)在一個(gè)表中建立了聚集索引,則表中的數(shù)據(jù)頁(yè)會(huì)在會(huì)按照索引的順序來(lái)存放
非聚集索引(Nonclustered Index):具有完全獨(dú)立于數(shù)據(jù)行的結(jié)構(gòu),使用非聚集索引不用將物理數(shù)據(jù)頁(yè)中絕銷的數(shù)據(jù)按列排序,即非聚集索引不會(huì)影響數(shù)據(jù)表中記錄的實(shí)際存儲(chǔ)順序。非聚集索引的葉節(jié)點(diǎn)存儲(chǔ)了組成非聚集索引的關(guān)鍵字值和行定位器。
填充因子:指索引中一個(gè)葉子節(jié)點(diǎn)的填充率,若都填滿就是100%,若填充率為嘩桐50%,則只有一半的數(shù)據(jù)
聚集索引狹義上講是主鍵,物理上說(shuō)就物虧是數(shù)據(jù)行實(shí)際存放的順序。
非聚集就是邏輯順序,會(huì)有一個(gè)獨(dú)立于表存在的“表”來(lái)存放邏輯順序,然后再根據(jù)主鍵查找到實(shí)際的數(shù)據(jù)行。
填充因此,形象的說(shuō)就是兩條記錄之冊(cè)橋間留給新增或修改主鍵的記錄的存儲(chǔ)位州螞猛置。
索引有兩種類型,分別是聚集索引(clustered
index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered
index,也稱非聚類索引、非簇集索引)。
聚集索引在一個(gè)表中只能有一個(gè),默認(rèn)情況下在主鍵建立的時(shí)候創(chuàng)建,它是規(guī)定數(shù)據(jù)在表中的物理存儲(chǔ)順序,我們也可以取消主鍵的聚集索引,所以必須考慮
數(shù)據(jù)庫(kù)可能用到的查詢類型以及使用的最為頻繁的查詢類型,對(duì)其最常用的一個(gè)字段或者多個(gè)字段建立聚集索引或者組合的聚集索引,它就是SQL
Server會(huì)在物理上按升序(默認(rèn))或者降序重排數(shù)據(jù)列,這樣就可以迅速的找到被查詢的數(shù)據(jù)。
非聚集索主要是數(shù)據(jù)存儲(chǔ)在一個(gè)地方,索引存儲(chǔ)在另一個(gè)地方,索引帶有指針指向數(shù)據(jù)的存儲(chǔ)位置。索引中的項(xiàng)目按索引鍵值的順序存儲(chǔ),而表中的信息按另
一種順序存儲(chǔ)。可以在一個(gè)表格中使用高達(dá)249個(gè)非聚集的索引,在查詢的過(guò)程中先對(duì)非聚集索引進(jìn)行搜索,找到數(shù)據(jù)值在表中的位置,然后從該位置直接檢索數(shù)
據(jù)。這使非聚集索引成為精確匹配查詢的更佳方法,因?yàn)樗饕枋霾樵兯阉鞯臄?shù)據(jù)值在表中的精確位置的條目。
填充因子:
使用
fill
factor
選項(xiàng)可以指定
Microsoft
SQL
Server
使用現(xiàn)有數(shù)據(jù)創(chuàng)建新索引時(shí)將每頁(yè)填滿到什么程度。由于在頁(yè)填充時(shí)
SQL
Server
必須花時(shí)間來(lái)拆分頁(yè),因此填充因子會(huì)影響性能。坦衫巧
僅在創(chuàng)建或重新生成索引時(shí)使用填充因子。頁(yè)面不會(huì)維護(hù)在任何特定的填充水平上。
fill
factor
的默認(rèn)值為
0,有效值介于
和
100
之間。FILLFACTOR
設(shè)置為
或
100
時(shí),葉級(jí)別幾乎完全填滿,但至少會(huì)保留一個(gè)其他索引行的空間。這樣設(shè)置后,葉級(jí)別空間會(huì)得到有效利用,而且仍有空間可以在必須拆分頁(yè)之前進(jìn)行有限擴(kuò)展讓鍵。很少需要更塌皮改
fill
factor
的默認(rèn)值,因?yàn)榭梢允褂?/p>
CREATE
INDEX
或
ALTER
INDEX
REBUILD
語(yǔ)句來(lái)覆蓋其對(duì)于指定索引的值。
sql server 怎么建立索引
什么是索引
拿漢語(yǔ)字典的目錄頁(yè)(索引)打比方:正如漢語(yǔ)字典中的漢字按頁(yè)存放一樣,SQL Server中的數(shù)據(jù)記錄也是按頁(yè)存放的,每頁(yè)容量一般為4K 。為了加快查找的速度,漢語(yǔ)字(詞)典一般都有按拼音、筆畫、偏旁部首等排序的目錄(索引),我們可以選擇按拼音或筆畫查找方式,快速查找到需要的字(詞)。
同理,SQL Server允許用戶在表中創(chuàng)建索引,指定按某列預(yù)先排序,從而大大提高查詢速度。
?SQL Server中的數(shù)據(jù)也是按頁(yè)( 4KB )存放
?索引:是SQL Server編排數(shù)據(jù)的內(nèi)部方法。它為SQL Server提供一種方法來(lái)編排查詢數(shù)據(jù)。
?索引頁(yè):數(shù)據(jù)庫(kù)中存儲(chǔ)索引的數(shù)據(jù)頁(yè);索引頁(yè)類似于漢語(yǔ)字(詞)典中按拼音或筆畫排序的目錄頁(yè)。
?索引的作用:通過(guò)使用索引,可以大大提高數(shù)據(jù)庫(kù)的檢索速度,改善數(shù)據(jù)庫(kù)性能。
索引類型
?唯一索引:唯一索引不允許兩行具有相同的索引值
?主鍵索引:為表定義一個(gè)主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個(gè)值是唯一的,并且不能為空
?聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個(gè)表只能有一個(gè)
?非聚集索引(Non-clustered):非知知聚集索引指定表的邏輯順序。數(shù)據(jù)存儲(chǔ)在一個(gè)位置,索引存儲(chǔ)在另一個(gè)位置,索引中包含指向數(shù)據(jù)存儲(chǔ)位置的指針??梢杂卸鄠€(gè),小于249個(gè)
索引蔽猛罩類型:再次用漢語(yǔ)字典打比方,希望大家能夠明白聚集索引和非聚集索引這兩個(gè)概念。
唯一索引:
唯一索引不允許兩行具有相同的索引值。
如果現(xiàn)有數(shù)據(jù)中存在重復(fù)的鍵值,則大多數(shù)數(shù)據(jù)庫(kù)都不允許將新創(chuàng)建的唯一索引與表一起保存。當(dāng)新數(shù)據(jù)將使表中的鍵值重復(fù)時(shí),數(shù)據(jù)庫(kù)也拒絕接受此數(shù)據(jù)。例如,如果在stuInfo表中的學(xué)員員身份證號(hào)(stuID) 列上創(chuàng)建了唯一索引,則所有學(xué)員的身份證號(hào)不能重復(fù)。
提示:創(chuàng)建了唯一約束,將自動(dòng)創(chuàng)建唯一索引。盡管唯一索引有助于找到信息,但為了獲得更佳性能,建議使用主鍵約束或唯一約束。
主鍵索引:
在數(shù)據(jù)庫(kù)關(guān)系圖中為表定義一個(gè)主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個(gè)值是唯一的。當(dāng)在查詢宏鬧中使用主鍵索引時(shí),它還允許快速訪問(wèn)數(shù)據(jù)。
聚集索引(clustered index)
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。表只能包含一個(gè)聚集索引。例如:漢語(yǔ)字(詞)典默認(rèn)按拼音排序編排字典中的每頁(yè)頁(yè)碼。拼音字母a,b,c,d……x,y,z就是索引的邏輯順序,而頁(yè)碼1,2,3……就是物理順序。默認(rèn)按拼音排序的字典,其索引順序和邏輯順序是一致的。即拼音順序較后的字(詞)對(duì)應(yīng)的頁(yè)碼也較大。如拼音“ha”對(duì)應(yīng)的字(詞)頁(yè)碼就比拼音“ba” 對(duì)應(yīng)的字(詞)頁(yè)碼靠后。
非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的數(shù)據(jù)訪問(wèn)速度。例如,按筆畫排序的索引就是非聚集索引,“1”畫的字(詞)對(duì)應(yīng)的頁(yè)碼可能比“3”畫的字(詞)對(duì)應(yīng)的頁(yè)碼大(靠后)。
提示:SQL Server中,一個(gè)表只能創(chuàng)建1個(gè)聚集索引,多個(gè)非聚集索引。設(shè)置某列為主鍵,該列就默認(rèn)為聚集索引
如何創(chuàng)建索引
使用T-SQL語(yǔ)句創(chuàng)建索引的語(yǔ)法:
CREATE
INDEX index_name
ON table_name (column_name…)
qUNIQUE表示唯一索引,可選
qCLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選
qFILLFACTOR表示填充因子,指定一個(gè)0到100之間的值,該值指示索引頁(yè)填滿的空間所占的百分比
在stuMarks表的writtenExam列創(chuàng)建索引:
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = ‘IX_writtenExam’)
DROP INDEX stuMarks.IX_writtenExam
/*–筆試列創(chuàng)建非聚集索引:填充因子為30%–*/
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
GO
/*—–指定按索引 IX_writtenExam 查詢—-*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
雖然我們可以指定SQL Server按哪個(gè)索引進(jìn)行數(shù)據(jù)查詢,但一般不需要我們?nèi)斯ぶ付?。SQL Server將會(huì)根據(jù)我們創(chuàng)建的索引,自動(dòng)優(yōu)化查詢。
索引的優(yōu)缺點(diǎn)
?優(yōu)點(diǎn)
–加快訪問(wèn)速度
–加強(qiáng)行的唯一性
?缺點(diǎn)
–帶索引的表在數(shù)據(jù)庫(kù)中需要更多的存儲(chǔ)空間
–操縱數(shù)據(jù)的命令需要更長(zhǎng)的處理時(shí)間,因?yàn)樗鼈冃枰獙?duì)索引進(jìn)行更新
創(chuàng)建索引的指導(dǎo)原則
?請(qǐng)按照下列標(biāo)準(zhǔn)選擇建立索引的列。
–該列用于頻繁搜索
–該列用于對(duì)數(shù)據(jù)進(jìn)行排序
?請(qǐng)不要使用下面的列創(chuàng)建索引:
–列中僅包含幾個(gè)不同的值。
–表中僅包含幾行。為小型表創(chuàng)建索引可能不太劃算,因?yàn)镾QL Server在索引中搜索數(shù)據(jù)所花的時(shí)間比在表中逐行搜索所花的時(shí)間更長(zhǎng)
創(chuàng)建索引:
(1)在SQL Server Management Studio中,選擇并右擊要?jiǎng)?chuàng)建索引的表,從彈出菜單中選擇“設(shè)計(jì)”,打開(kāi)表設(shè)計(jì)器。右鍵單擊表設(shè)計(jì)器,從彈出菜單中選擇“索引/鍵”命令,打開(kāi)“索引/鍵”對(duì)話框。對(duì)話框中列出了已經(jīng)存在的索引,如下圖所示。
(2)單擊“添加”按鈕。在“選定的主/唯一鍵或索引”框顯示系統(tǒng)分配給新索引的名稱。
(3)在“列”屬性下選擇要?jiǎng)?chuàng)建索引的列??梢赃x擇多達(dá)16列。為獲得更佳性能,更好只選擇一列或兩列。對(duì)所選的每一列,可指出索引是按升序還是降序組織列值。
(4)如果要?jiǎng)?chuàng)建唯一索引,則在“是唯一的”屬性中選擇“是”。
(5)設(shè)置完成后,單擊“確定”按鈕。
(6)當(dāng)保存表時(shí),索引即創(chuàng)建在數(shù)據(jù)庫(kù)中。
使用CREATE INDEX語(yǔ)句創(chuàng)建索引:
復(fù)制內(nèi)容到剪貼和虛板
代碼:
CREATE INDEX索引名
ON {表名|視圖名} (列名 )
例:
在數(shù)據(jù)庫(kù)HrSystem中為表Employees創(chuàng)建基于IDCard列的唯一索引IX_Employees,可以使用以下命令:
復(fù)制內(nèi)容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE NONCLUSTERED INDEX ONdbo.Employees(IdCard)
GO
例:
為表Employees創(chuàng)建基于列IDCard的唯一、聚集索引IX_Employees1,可以使用以下命令:
復(fù)制內(nèi)容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE CLUSTERED INDEX ON .(IdCard)
GO
需要注意的是彎棚蔽,在一個(gè)表中只允許存在一個(gè)聚集索引。因此,如果表Employees中已經(jīng)存在一個(gè)聚集索引,則執(zhí)行上面的語(yǔ)句時(shí)將會(huì)提示下面的錯(cuò)誤信息。
消息1902,級(jí)別16,狀態(tài)3,第1行
無(wú)法對(duì)表’dbo.Employees’創(chuàng)建多個(gè)聚集索引。請(qǐng)?jiān)趧?chuàng)建新聚集索引前刪除現(xiàn)有的聚集索引’PK__Employee__263E2DD’。 例:
對(duì)表Employees的列Emp_name按照降序創(chuàng)建索引,可以使用以下命令:
復(fù)制內(nèi)容到剪貼板
代碼:
USE HrSystem
GO
CREATENONCLUSTERED INDEX ON .
(
DESC
)
GO
在CREATE INDEX語(yǔ)句中使用INCLUDE子句,可以在創(chuàng)建索引時(shí)定義包含的非鍵列,其語(yǔ)法結(jié)構(gòu)如下:
復(fù)制內(nèi)容到剪貼板
代碼:
CREATENONCLUSTERED INDEX 索引名
ON { 表名| 視圖名 } ( 列名 )
INCLUDE (, , )
例: 在表Employees上創(chuàng)建非聚集索引IX_Wage,索引中的鍵列為Wage,非鍵列為Emp_name、Sex和Title,具體語(yǔ)句如下:
復(fù)制內(nèi)容到剪貼板
代碼:
USEHrSystem
GO
CREATENONCLUSTERED INDEX IX_Wage
ON Employees ( Wage )
INCLUDE (Emp_name, Sex, Title)
GO
例: 在創(chuàng)建索引IX_Wage后,當(dāng)表Employees中的數(shù)據(jù)量比較大時(shí),執(zhí)行下面的SELECT語(yǔ)句將會(huì)明顯地改進(jìn)查詢效率。
復(fù)制內(nèi)容到剪貼板
代碼:
USEHrSystem
GO
SELECTEmp_name, Sex, Title, Wage
FROMEmployees
WHEREWage BETWEEN 1000 AND 3000
GO
數(shù)據(jù)庫(kù)創(chuàng)一個(gè)聚集索引的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫(kù)創(chuàng)一個(gè)聚集索引,「聚集索引」助力數(shù)據(jù)庫(kù)快速檢索數(shù)據(jù),數(shù)據(jù)庫(kù)中聚集索引、非聚集索引、填充因子的概念?,sql server 怎么建立索引的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
名稱欄目:「聚集索引」助力數(shù)據(jù)庫(kù)快速檢索數(shù)據(jù)(數(shù)據(jù)庫(kù)創(chuàng)一個(gè)聚集索引)
本文來(lái)源:http://www.dlmjj.cn/article/djpscdi.html


咨詢
建站咨詢
