日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL的聚集索引

發(fā)布時(shí)間:2023/11/30 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL的聚集索引 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其實(shí)對(duì)于非專業(yè)的數(shù)據(jù)庫(kù)操作人員來(lái)講,例如軟件開(kāi)發(fā)人員,在很大程度上都搞不清楚數(shù)據(jù)庫(kù)索引的一些基本知識(shí),有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺(jué)的是行業(yè)原因,有很多公司都有自己的DBA團(tuán)隊(duì),他們會(huì)幫助你優(yōu)化SQL,開(kāi)發(fā)人員即使不懂優(yōu)化問(wèn)題也不大,所以開(kāi)發(fā)人員對(duì)這方面也就不會(huì)下太多功夫去了解SQL優(yōu)化,但如果公司沒(méi)有這樣的DBA呢,就只能靠程序員自己了。 最近突然想起前一陣和一朋友的聊天,當(dāng)時(shí)他問(wèn)我的問(wèn)題是一個(gè)非常普通的問(wèn)題:說(shuō)說(shuō)SQL聚集索引和非聚集索引的區(qū)別。大家可能認(rèn)為這個(gè)問(wèn)題難度不大,認(rèn)為太熟悉了,也許不會(huì)感興趣,但你真能說(shuō)清楚嗎?其實(shí)要想說(shuō)明白這兩者的差別也不是三兩句就說(shuō)的清的,那天我也是覺(jué)的這問(wèn)題太泛了,就隨便說(shuō)了其中的兩個(gè)區(qū)別:聚集索引一個(gè)表只能有一個(gè),而非聚集索引一個(gè)表可以存在多個(gè),這個(gè)跟沒(méi)問(wèn)題沒(méi)差別,一般人都知道。聚集索引存儲(chǔ)記錄是物理上連續(xù)存在,而非聚集索引是邏輯上的連續(xù),物理存儲(chǔ)并不連續(xù),這個(gè)大家也都知道。上面的兩點(diǎn)從大的方面講都是講的通的,后面我們繼續(xù)探討,舉一個(gè)實(shí)際點(diǎn)的例子,一個(gè)學(xué)生表student,里面是學(xué)生號(hào)id,學(xué)生姓名,學(xué)生所在城市ID,學(xué)生成績(jī)(總分)。問(wèn):如果想按姓名查詢,如何做優(yōu)化?答:在姓名字段上建立索引。問(wèn):建立什么類型的索引?答:建立非聚集索引。問(wèn):為什么?答:一般有范圍查詢的需求,可以考慮在此字段上創(chuàng)建聚集索引。問(wèn):學(xué)分有重復(fù)性,在學(xué)分字段上創(chuàng)建聚集索引能行嗎? ....沉思,不能創(chuàng)建嗎?之前的項(xiàng)目好像真這樣做過(guò)答:應(yīng)該可以吧。問(wèn):聚集索引的約束是什么?答:唯一性啊?問(wèn):既然是唯一性,那么學(xué)分字段上還能創(chuàng)建聚集索引嗎?....再次沉思,應(yīng)該可以啊,但索引的約束又怎么說(shuō)呢?答:應(yīng)該可以的,以前用過(guò)。我自認(rèn)為是對(duì)數(shù)據(jù)庫(kù)索引知識(shí)有一定研究的,但可能是有兩年沒(méi)實(shí)際接觸SQL的原因,一時(shí)還真想不出具有說(shuō)服力的解釋,朋友們看到這能解答我的問(wèn)題嗎?其實(shí)上面的我們需要搞清楚以下幾個(gè)問(wèn)題:第一:聚集索引的約束是唯一性,是否要求字段也是唯一的呢?分析:如果認(rèn)為是的朋友,可能是受系統(tǒng)默認(rèn)設(shè)置的影響,一般我們指定一個(gè)表的主鍵,如果這個(gè)表之前沒(méi)有聚集索引,同時(shí)建立主鍵時(shí)候沒(méi)有強(qiáng)制指定使用非聚集索引,SQL會(huì)默認(rèn)在此字段上創(chuàng)建一個(gè)聚集索引,而主鍵都是唯一的,所以理所當(dāng)然的認(rèn)為創(chuàng)建聚集索引的字段也需要唯一。結(jié)論:聚集索引可以創(chuàng)建在任何一列你想創(chuàng)建的字段上,這是從理論上講,實(shí)際情況并不能隨便指定,否則在性能上會(huì)是惡夢(mèng)。第二:為什么聚集索引可以創(chuàng)建在任何一列上,如果此表沒(méi)有主鍵約束,即有可能存在重復(fù)行數(shù)據(jù)呢?粗一看,這還真是和聚集索引的約束相背,但實(shí)際情況真可以創(chuàng)建聚集索引,分析其原因是:如果未使用 UNIQUE 屬性創(chuàng)建聚集索引,數(shù)據(jù)庫(kù)引擎將向表自動(dòng)添加一個(gè)四字節(jié) uniqueifier 列。必要時(shí),數(shù)據(jù)庫(kù)引擎 將向行自動(dòng)添加一個(gè) uniqueifier 值,使每個(gè)鍵唯一。此列和列值供內(nèi)部使用,用戶不能查看或訪問(wèn)。第三:是不是聚集索引就一定要比非聚集索引性能優(yōu)呢?如果想查詢學(xué)分在60-90之間的學(xué)生的學(xué)分以及姓名,在學(xué)分上創(chuàng)建聚集索引是否是最優(yōu)的呢?答:否。既然只輸出兩列,我們可以在學(xué)分以及學(xué)生姓名上創(chuàng)建聯(lián)合非聚集索引,此時(shí)的索引就形成了覆蓋索引,即索引所存儲(chǔ)的內(nèi)容就是最終輸出的數(shù)據(jù),這種索引在比以學(xué)分為聚集索引做查詢性能更好。第四:在數(shù)據(jù)庫(kù)中通過(guò)什么描述聚集索引與非聚集索引的?索引是通過(guò)二叉樹(shù)的形式進(jìn)行描述的,我們可以這樣區(qū)分聚集與非聚集索引的區(qū)別:聚集索引的葉節(jié)點(diǎn)就是最終的數(shù)據(jù)節(jié)點(diǎn),而非聚集索引的葉節(jié)仍然是索引節(jié)點(diǎn),但它有一個(gè)指向最終數(shù)據(jù)的指針。第五:在主鍵是創(chuàng)建聚集索引的表在數(shù)據(jù)插入上為什么比主鍵上創(chuàng)建非聚集索引表速度要慢?有了上面第四點(diǎn)的認(rèn)識(shí),我們分析這個(gè)問(wèn)題就有把握了,在有主鍵的表中插入數(shù)據(jù)行,由于有主鍵唯一性的約束,所以需要保證插入的數(shù)據(jù)沒(méi)有重復(fù)。我們來(lái)比較下主鍵為聚集索引和非聚集索引的查找情況:聚集索引由于索引葉節(jié)點(diǎn)就是數(shù)據(jù)頁(yè),所以如果想檢查主鍵的唯一性,需要遍歷所有數(shù)據(jù)節(jié)點(diǎn)才行,但非聚集索引不同,由于非聚集索引上已經(jīng)包含了主鍵值,所以查找主鍵唯一性,只需要遍歷所有的索引頁(yè)就行,這比遍歷所有數(shù)據(jù)行減少了不少I(mǎi)O消耗。這就是為什么主鍵上創(chuàng)建非聚集索引比主鍵上創(chuàng)建聚集索引在插入數(shù)據(jù)時(shí)要快的真正原因。好了,講這這些,不知道大家是否真的了解SQL的聚焦索引,我也是數(shù)據(jù)庫(kù)新手(從使用時(shí)間上來(lái)講也不算新了,哈哈),不專業(yè),有什么不對(duì)的地方,希望大家批評(píng)指正,下篇我會(huì)分析一些數(shù)據(jù)庫(kù)訪問(wèn)索引的情況,有圖的情況下,也許看的更加明白。

轉(zhuǎn)載于:https://www.cnblogs.com/lechie/archive/2011/11/27/2383253.html

總結(jié)

以上是生活随笔為你收集整理的SQL的聚集索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。