java性能調(diào)優(yōu)的基本知識(shí)_第1頁(yè)
java性能調(diào)優(yōu)的基本知識(shí)_第2頁(yè)
java性能調(diào)優(yōu)的基本知識(shí)_第3頁(yè)
java性能調(diào)優(yōu)的基本知識(shí)_第4頁(yè)
java性能調(diào)優(yōu)的基本知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java 堆是指在程序運(yùn)行時(shí)分配給對(duì)象生存的空間。通過-mx/-Xmx 和-ms/-Xms 來設(shè)置起始堆的大小和最大堆的大小。根據(jù)自己 JDK 的版本和廠家決定使用-mx 和-ms 或-Xmx 和-Xms。Java 堆大小決定了垃圾回收的頻度和速度,Java 堆越大,垃圾回收的頻度越低,速度越慢。同理,Java 堆越小,垃圾回收的頻度越高,速度越快。要想設(shè)置比較理想的參數(shù),還是需要了解一些基礎(chǔ)知識(shí)的。Java 堆的最大值不能太大,這樣會(huì)造成系統(tǒng)內(nèi)存被頻繁的交換和分頁(yè)。所以最大內(nèi)存必須低于物理內(nèi)存減去其他應(yīng)用程序和進(jìn)程需要的內(nèi)存。而且堆設(shè)置的太大,造成垃圾回收的時(shí)間過長(zhǎng),這樣將得不償失,極大的影

2、響程序的性能。以下是一些經(jīng)常使用的參數(shù)設(shè)置:1)設(shè)置-Xms 等于-XmX 的值;2)估計(jì)內(nèi)存中存活對(duì)象所占白空間的大小,設(shè)置-Xms 等于此值,-Xmx 四倍于此值;3)設(shè)置-Xms 等于-Xmx 的 1/2 大??;4)設(shè)置-Xms 介于-Xmx 的 1/10 至 U1/4 之間;5)使用默認(rèn)的設(shè)置。大家需要根據(jù)自己的運(yùn)行程序的具體使用場(chǎng)景,來確定最適合自己的參數(shù)設(shè)置。除了-Xms 和-Xmx 兩個(gè)最重要的參數(shù)外,還有很多可能會(huì)用到的參數(shù),這些參數(shù)通常強(qiáng)烈的依賴于垃圾收集的算法,所以可能因?yàn)?JDK 的版本和廠家而有所不同。但這些參數(shù)一般在 Web 開發(fā)中用的比較少,我就不做詳細(xì)介紹了。在實(shí)

3、際的應(yīng)用中注意設(shè)置-Xms 和-Xmx 使其盡可能的優(yōu)化應(yīng)用程序就行了。對(duì)于性能要求很高的程序,就需要自己再多研究研究 Java 虛擬機(jī)和垃圾收集算法的機(jī)制了。可以看看曹曉鋼翻譯的深入 Java 虛擬機(jī)一書。Java 程序性能調(diào)優(yōu)的基本知識(shí)和 JDK調(diào)優(yōu)一基本知識(shí)1.1性能是什么在性能調(diào)優(yōu)之前,我們首先來了解一下性能是什么?關(guān)于性能,我想每個(gè)學(xué)習(xí)過 Java 的人都能列出幾點(diǎn),甚至可以夸夸其談。在JavaTMPlatformPerformance一書中,定義了如下五個(gè)方面來作為評(píng)判性能的標(biāo)準(zhǔn):1)運(yùn)算的性能一一哪一個(gè)算法的執(zhí)行性能最好?2)內(nèi)存的分配一一程序運(yùn)行時(shí)需要耗費(fèi)多少內(nèi)存?3)啟動(dòng)的時(shí)

4、間一一程序啟動(dòng)需要多長(zhǎng)時(shí)間?這在 Web 項(xiàng)目中的影響不大,但要注意部分程序需要部署或運(yùn)行在客戶端時(shí)的情形(比如 applet 程序)。4)程序的可伸縮性一一在壓力負(fù)載的情況下,程序的性能如何?5)性能的感知一一用戶在什么情況下會(huì)覺得程序的性能不好?以上五個(gè)方面,在具體的使用場(chǎng)景可以有選擇的去評(píng)判。至于這五方面的性能調(diào)優(yōu),在后續(xù)的章節(jié)中將會(huì)陸續(xù)的給以相應(yīng)的性能調(diào)優(yōu)策略。1.2調(diào)優(yōu)的規(guī)則我們只需要關(guān)心對(duì)我們程序有影響,可以察覺到的性能問題,而不是每一個(gè)類中的每一個(gè)方法我們都需要想方設(shè)法的提高性能。如果程序的性能沒有達(dá)到我們所期望的要求,我們才需要考慮如何優(yōu)化性能。同樣的,晦澀的代碼雖然提高了程序

5、的性能,但同時(shí)可能帶給我們的是維護(hù)的噩夢(mèng)。我們需要折中的考慮以上兩種情況,使得程序的代碼是優(yōu)美的,并且運(yùn)行的足夠快,達(dá)到客戶所期望的性能要求。優(yōu)化代碼甚至?xí)?dǎo)致不良的結(jié)果,DonaldKnuth(一位比較牛比較有影響的人物,具體是誰(shuí),我也忘了,誰(shuí)知道,可以告訴我一下,謝謝?。┰f過,Prematureoptimizationistherootofallevil 在開始性能調(diào)優(yōu)前,需要先指出不優(yōu)化代碼的一些理由。1)如果優(yōu)化的代碼已經(jīng)正常工作,優(yōu)化后可能會(huì)引入新的 bug;2)優(yōu)化代碼趨向于使代碼更難理解和維護(hù);3)在一個(gè)平臺(tái)上優(yōu)化的代碼,在另一個(gè)平臺(tái)上可能更糟;4)花費(fèi)很多時(shí)間在代碼的優(yōu)化上,

6、提高了很少的性能,卻導(dǎo)致了晦澀的代碼。確實(shí),在優(yōu)化前,我們必須認(rèn)真的考慮是否值得去優(yōu)化。1.3調(diào)優(yōu)的步驟一般我們提高應(yīng)用程序的性能劃分為以下幾個(gè)步驟:1)明確應(yīng)用程序的性能指標(biāo),怎樣才符合期望的性能需求;2)在目標(biāo)平臺(tái)進(jìn)行測(cè)試;3)如果性能已經(jīng)達(dá)到性能指標(biāo),Stop;4)查找性能瓶頸;5)修改性能瓶頸;6)返回到第 2 步二 JDK 調(diào)優(yōu)1)選擇合適的 JDK 版本不同版本的 JDK,甚至不同廠家的 JDK 可能都存在著很大的差異,對(duì)于性能優(yōu)化的程度不同。一般來說,盡可能選擇最新發(fā)布的穩(wěn)定的 JDK 版本。最新的穩(wěn)定的 JDK 版本相對(duì)以前的 JDK 版本都會(huì)做一些bug 的修改和性能的優(yōu)化工

7、作。1)垃圾收集 Java 堆的優(yōu)化垃圾收集就是自動(dòng)釋放不再被程序所使用的對(duì)象的過程。當(dāng)一個(gè)對(duì)象不再被程序所引用時(shí),它所引用的堆空間可以被回收,以便被后續(xù)的新對(duì)象所使用。垃圾收集器必須能夠斷定哪些對(duì)象是不再被引用的,并且能夠把它們所占據(jù)的堆空間釋放出來。如果對(duì)象不再被使用,但還有被程序所引用,這時(shí)是不能被垃圾收集器所回收的,此時(shí)就是所謂的“內(nèi)存泄漏”。 監(jiān)控應(yīng)用程序是否發(fā)生了內(nèi)存泄漏, 有一個(gè)非常優(yōu)秀的監(jiān)控工具推薦給大家一一 Quest 公司的 JProbe 工具,使用它來觀察程序運(yùn)行期的內(nèi)存變化,并可產(chǎn)生內(nèi)存快照,從而分析并定位內(nèi)存泄漏的確切位置,可以精確定位到源碼內(nèi)。這個(gè)工具的使用我在后續(xù)

8、的章節(jié)中還會(huì)做具體介紹。Java 堆是指在程序運(yùn)行時(shí)分配給對(duì)象生存的空間。通過-mx/-Xmx 和-ms/-Xms 來設(shè)置起始堆的大小和最大堆的大小。根據(jù)自己 JDK 的版本和廠家決定使用-mx 和-ms 或-Xmx 和-Xms。Java 堆大小決定了垃圾回收的頻度和速度,Java 堆越大,垃圾回收的頻度越低,速度越慢。同理,Java 堆越小,垃圾回收的頻度越高,速度越快。要想設(shè)置比較理想的參數(shù),還是需要了解一些基礎(chǔ)知識(shí)的。Java 堆的最大值不能太大,這樣會(huì)造成系統(tǒng)內(nèi)存被頻繁的交換和分頁(yè)。所以最大內(nèi)存必須低于物理內(nèi)存減去其他應(yīng)用程序和進(jìn)程需要的內(nèi)存。而且堆設(shè)置的太大,造成垃圾回收的時(shí)間過長(zhǎng),

9、這樣將得不償失,極大的影響程序的性能。以下是一些經(jīng)常使用的參數(shù)設(shè)置:1)設(shè)置-Xms 等于-XmX 的值;2)估計(jì)內(nèi)存中存活對(duì)象所占的空間的大小,設(shè)置-Xms 等于此值,-Xmx 四倍于此值;3)設(shè)置-Xms 等于-Xmx 的 1/2 大?。?)設(shè)置-Xms 介于-Xmx 的 1/10 到 1/4 之間;5)使用默認(rèn)的設(shè)置。大家需要根據(jù)自己的運(yùn)行程序的具體使用場(chǎng)景,來確定最適合自己的參數(shù)設(shè)置。除了-Xms 和-Xmx兩個(gè)最重要的參數(shù)外,還有很多可能會(huì)用到的參數(shù),這些參數(shù)通常強(qiáng)烈的依賴于垃圾收集的算法,所以可能因?yàn)?JDK的版本和廠家而有所不同。但這些參數(shù)一般在 Web#發(fā)中用的比較少,我就不做

10、詳細(xì)介紹了。在實(shí)際的應(yīng)用中注意設(shè)置-Xms 和-Xmx 使其盡可能的優(yōu)化應(yīng)用程序就行了。對(duì)于性能要求很高的程序,就需要自己再多研究研究 Java 虛擬機(jī)和垃圾收集算法的機(jī)制了。可以看看曹曉鋼翻譯的深入 Java虛擬機(jī)一書Web 應(yīng)用程序調(diào)優(yōu)指南時(shí)間:2009-09-0922:45:36 來源:網(wǎng)絡(luò)作者:未知點(diǎn)擊:120 次一.成功的應(yīng)用都是相似的,失敗的應(yīng)用各有各的失敗一.成功的應(yīng)用都是相似的,失敗的應(yīng)用各有各的失敗對(duì)于 Web 應(yīng)用來說,影響性能的集中體現(xiàn)在網(wǎng)絡(luò)/CPU/內(nèi)存/IO/數(shù)據(jù)庫(kù)/緩存這 6 個(gè)環(huán)節(jié)的處理上。一個(gè)穩(wěn)定應(yīng)用的特征應(yīng)該包括:網(wǎng)絡(luò)流量平穩(wěn),連接數(shù)保持穩(wěn)定低 CPU 負(fù)載內(nèi)

11、存曲線平穩(wěn)IO 高響應(yīng)數(shù)據(jù)庫(kù)的低負(fù)載,高響應(yīng)簡(jiǎn)單的來說,對(duì)于每個(gè)不穩(wěn)定的應(yīng)用來說,都會(huì)有一個(gè)瓶頸,通過以上的工具分析,加上自己的判斷,找到那個(gè)瓶頸,解決它!我們可以通過以下監(jiān)控工具可監(jiān)控到應(yīng)用的各項(xiàng)指標(biāo)網(wǎng)絡(luò)監(jiān)控工具 Cacti,可以監(jiān)控到整個(gè)服務(wù)器的流量/硬盤/CPU 負(fù)載等情況JVM 監(jiān)控 JConsole(JDK1.5 以上版本自帶),%JAVA_HOME%binjconsoleJava 啟動(dòng)加上一下參數(shù):-Dcom.sun.management.jmxremote.port=5004(監(jiān)控端口)-Dcom.sun.management.jmxremote.ssl=false-Dcom.s

12、un.management.jmxremote.authenticate=falseVisualVM(JDK1.6_07 以上版本自帶)%JAVA_HOME%binjvisualvm配置方法同 JConsole,VisualVM 比 JConsole 多了一個(gè)實(shí)用功能 TheadDump.TheadDump 可以很清晰的告訴你 JVM 當(dāng)前正在做什么,內(nèi)存里有哪些進(jìn)程,是否有死鎖。重點(diǎn)觀察 RUNNABLE 和 LOCK 是否有死鎖。5.數(shù)據(jù)庫(kù)查看MySql 的 showprocesslist 命令二.調(diào)優(yōu)手段和策略網(wǎng)絡(luò)層優(yōu)化不同類型的應(yīng)用所能承受的網(wǎng)絡(luò)負(fù)載各不相同,對(duì)于長(zhǎng)連接應(yīng)用來說,比如下

13、載應(yīng)用,所能承受的連接數(shù)就相對(duì)低,對(duì)于短鏈接應(yīng)用,比如計(jì)數(shù)應(yīng)用,所能承受的連接數(shù)就相對(duì)高,對(duì)于一般有數(shù)據(jù)庫(kù)的應(yīng)用來說,每秒的連接數(shù)保持在 700 以下都是沒問題的。這里調(diào)優(yōu)的方面包括:Linux 可以優(yōu)化網(wǎng)絡(luò)的 TCP 參數(shù),提高網(wǎng)絡(luò)的響應(yīng),增加服務(wù)器實(shí)現(xiàn)負(fù)載均衡,目的降低單臺(tái)服務(wù)器流量?jī)?yōu)化程序,盡可能的減少處理的時(shí)間,如果一定有長(zhǎng)時(shí)間處理的場(chǎng)景,可以采用異步方式處理。先返回一個(gè)請(qǐng)求 ID,然后客戶端再通過這個(gè) ID 來獲得結(jié)果。CPU 優(yōu)化就目前的硬件環(huán)境來看,CPU 都不會(huì)是一個(gè)瓶頸。如果 CPU 出現(xiàn)負(fù)載高,基本上都是程序處理不當(dāng)引起,比如有深度遞歸或者循環(huán)或者頻繁寫磁盤,一旦出現(xiàn)高負(fù)載

14、,會(huì)引起一系列的連鎖反應(yīng),響應(yīng)降低,連接數(shù)增加。這個(gè)環(huán)節(jié)主要是優(yōu)化程序:b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8192fa4b減少循環(huán)和遞歸b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8192fa4b減少 synchronized 的用法。對(duì)于多服務(wù)器場(chǎng)景,要實(shí)現(xiàn)鎖機(jī)制,用 synchronized 不一4.Kill-3 來獲取 TheadDump定適合。Synchronized 使用不當(dāng),極容易造成死鎖。b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8

15、192fa4b減少死鎖發(fā)生的可能性。JConsole 提供了一個(gè)檢測(cè)死鎖的方法,TheadDump 也可以分析死鎖。內(nèi)存優(yōu)化對(duì)于 Java 應(yīng)用來說,內(nèi)存調(diào)優(yōu)是關(guān)鍵。先來認(rèn)識(shí)一下 Java 內(nèi)存的構(gòu)成和垃圾回收的機(jī)制:堆是應(yīng)用程序使用的主要部分,一旦堆滿,應(yīng)用程序就會(huì)拋出 OutOfMemory 錯(cuò)誤。具體關(guān)于堆的構(gòu)成以及垃圾回收算法,可以參考文檔:http:/ JVM 內(nèi)存, 使得可使用的堆內(nèi)存盡可能多,延長(zhǎng)垃圾回收的時(shí)間。需要注意的是,一般來說,回收 1G 內(nèi)存所需要的時(shí)間是 7 秒左右,如果這個(gè)時(shí)間訪問量比較高,極容易導(dǎo)致應(yīng)用停止響應(yīng),所以并非是越大內(nèi)存越好。通過增加 XX:+Print

16、GCDetails 參數(shù)可以觀察到垃圾回收的頻率和時(shí)間 2)調(diào)整垃圾回收策略,加快 JVM 的回收,因?yàn)?Web 應(yīng)用響應(yīng)高,很多都是無(wú)用內(nèi)存,加快回收可以保證有效堆會(huì)更多,這種方式會(huì)消耗更多的 CPU。IO 優(yōu)化為了提高 IO 的響應(yīng),盡可能的不要把所有文件寫到同一個(gè)目錄下,所有的請(qǐng)求集中在一個(gè)磁盤上。當(dāng)一個(gè)目錄下超過 2000 個(gè)文件,就會(huì)導(dǎo)致 IO 響應(yīng)下降。這個(gè)環(huán)節(jié)調(diào)優(yōu)包括5fd4c-99d6-4566-a4c9-38fb3d203c20-Numbered_0%98d07采用更快的 IO 設(shè)備,比如 NAS 存儲(chǔ)設(shè)備5fd4c-99d6-4566-a4c9-38fb3d203c20-N

17、umbered_0%98d07如果可能,將文件緩存到內(nèi)存,或者先寫內(nèi)存,定時(shí)回寫磁盤。5fd4c-99d6-4566-a4c9-38fb3d203c20-Numbered_0%98d07將讀和寫操作分開來實(shí)現(xiàn)。比如一個(gè)線程只寫,一個(gè)線程只讀。數(shù)據(jù)庫(kù)優(yōu)化這個(gè)環(huán)節(jié)可以優(yōu)化的地方比較多,通常由以下幾個(gè)方面: 攙愀昀挀 一甀洀戀攀爀攀攙開挀愀挀 攙 愀 愀昀 65536513057 愀 愀戀攀昀 一甀洀戀攀爀攀攙開攙 愀昀 攙昀愀戀昀昀建立索引 攙愀昀挀 一甀洀戀攀爀攀攙開挀愀挀 攙 愀 愀昀 65536523057 愀 愀戀攀昀 一甀洀戀攀爀攀攙開攙 愀昀 攙昀愀戀昀昀對(duì)于復(fù)雜的業(yè)務(wù)邏輯,采用存儲(chǔ)過

18、程實(shí)現(xiàn) 攙愀昀挀 一甀洀戀攀爀攀攙開挀愀挀 攙 愀 愀昀 65536533057 愀 愀戀攀昀 一甀洀戀攀爀攀攙開攙 愀昀 攙昀愀戀昀昀對(duì)于大數(shù)據(jù)量,采用歸檔或者分表方式進(jìn)行處理。比如 100 萬(wàn)的數(shù)據(jù)要 0.1 秒就讀取出來,如果采用分表,降低的數(shù)據(jù)規(guī)模,實(shí)現(xiàn)這個(gè)是不難的。緩存這個(gè)的最終目的是為了保證以上各個(gè)環(huán)節(jié)順暢。緩存從架構(gòu)上來分包括集中式緩存,如 Memcached分布式緩存,如 OpenJPA 的二級(jí)緩存,采用 JGroup 方式來同步從類型上來分包括頁(yè)面緩存,頁(yè)面緩存可以定時(shí)更新數(shù)據(jù)緩存,可以先把數(shù)據(jù)緩存到內(nèi)存,然后定時(shí)寫入數(shù)據(jù)庫(kù)。三.構(gòu)架一個(gè)穩(wěn)定應(yīng)用應(yīng)用分類首先要認(rèn)識(shí)到,不同的應(yīng)

19、用需要的資源和處理的方式是不一樣的,所以在開發(fā)一個(gè)應(yīng)用之前,要認(rèn)識(shí)到應(yīng)用的特征及其可能的瓶頸。為每類應(yīng)用定制一個(gè)解決套餐,是成功的基礎(chǔ)??芍赜玫奶幚砟P鸵⒁粋€(gè)可重用的程序庫(kù),比如計(jì)數(shù)框架,緩存框架,模板框架。當(dāng)你需要的時(shí)候,不是重新開發(fā),而是拿過來直接使用就可以了。持續(xù)監(jiān)控和改進(jìn)隨著時(shí)間的推移,應(yīng)用所需要的資源也會(huì)不同,有些應(yīng)用可能比預(yù)想的差,需要減少資源,有些發(fā)展迅猛,需要增加資源。這些都需要我們建立一個(gè)可持續(xù)的監(jiān)控機(jī)制。四.常見不穩(wěn)定問題處理辦法1.內(nèi)存只漲不降查看一下網(wǎng)絡(luò)流量,看是否是持續(xù)增加,如果網(wǎng)絡(luò)流量正常,很可能你的程序有內(nèi)存泄漏問題。建議的辦法:改程序/增加內(nèi)存或者提高垃圾回

20、收的頻率。更多有待完善中。本指南不是一個(gè)教科讀書,更多的是經(jīng)驗(yàn)總結(jié),目的是為了開發(fā)高響應(yīng)/高并發(fā)的 Web應(yīng)用,會(huì)不斷的補(bǔ)充完善,如果需要具體的幫助,可以 Google 一下。http:/ http:/原文鏈接誤區(qū) 1:索引創(chuàng)建得越多越好?實(shí)際上:創(chuàng)建的索引可能建立后從來未使用。索引的創(chuàng)建也是需要代價(jià)的,對(duì)于刪除、某些更新、插入操作,對(duì)于每個(gè)索引都要進(jìn)行相應(yīng)的刪除、更新、插入操作。從而導(dǎo)致刪除、某些更新、插入操作的效率變低。誤區(qū) 2:對(duì)于一個(gè)單表的查詢,可以索引 1 進(jìn)行過濾再使用索引 2 進(jìn)行過濾?實(shí)際上:假設(shè)查詢語(yǔ)句如下 select*fromt1wherec1=1andc2=2,cl 列

21、和c2 列上分別建有索引 ic1、 ic2。先使用 ic1(或 ic2)進(jìn)行過濾, 產(chǎn)生的結(jié)果集是臨時(shí)數(shù)據(jù),不再具有索引,所以不可使用 ic2(或 ic1)進(jìn)行再次過濾。索引優(yōu)化的基本原則:1、將索引和數(shù)據(jù)存放到不同的文件組沒有將表數(shù)據(jù)和索引數(shù)據(jù)存儲(chǔ)到不同的文件組,而不加區(qū)別地將它們存儲(chǔ)到同一文件組。這樣,不但會(huì)造成 I/O 競(jìng)爭(zhēng),也為數(shù)據(jù)庫(kù)的維護(hù)工作帶來不變。2、組合索引的使用假設(shè)存在組合索引 it1c1c2(c1,c2),查詢語(yǔ)句 select*fromt1wherec1=1andc2=2 能夠使用該索引。查詢語(yǔ)句 select*fromt1wherec1=1 也能夠使用該索引。但是,查詢

22、語(yǔ)句select*fromt1wherec2=2 不能夠使用該索引,因?yàn)闆]有組合索引的引導(dǎo)列,即,要想使用 c2 列進(jìn)行查找,必需出現(xiàn) c1 等于某值。根據(jù) where 條件的不同,歸納如下:c1=1andc2=2:使用索引 it1c1c2 進(jìn)行等值查找。c1=1andc22:使用索引 it1c1c2 進(jìn)行范圍查找,可以有兩種方法。方法 1,使用通過索引鍵(1,2)在 B 樹中命中一條記錄,然后向后掃描找出第一條符合條件的記錄,從此記錄往后的每一條記錄都是符合條件的。這種方法的弊端在于:如果c1=1andc2=2 對(duì)應(yīng)的記錄數(shù)很多,會(huì)產(chǎn)生很多無(wú)效的掃描。方法 2,如果 c2 對(duì)應(yīng)的 int 型

23、數(shù)據(jù),可以使用索引鍵(1,3)在 B 樹中命中一條記錄,從此記錄往后的每一條記錄都是符合條件的。本文中的例子均采用方法 1。3)c11andc2=2:因?yàn)樗饕牡谝粋€(gè)列不是等于號(hào)的,索引即使后面出現(xiàn)了c2=2,也不能將 c2=2 應(yīng)用于索引查找。這里,通過索引鍵(1,-oo)在B樹中命中一條記錄,向后掃描找出第一條符合 c11 的記錄,此后的每一條記錄判斷是否符合 c2=2,如果符合則輸出,否則過濾掉。這里我們稱 c2=2 沒有參與到索引運(yùn)算中去。這種情況在實(shí)際應(yīng)用中經(jīng)常出現(xiàn)。4)c11:通過索引鍵(1,-8)在 B 樹中命中一條記錄, 以此向后掃描找出第一條符合 c11的記錄,此后的每條記錄

24、都是符合條件的。3、唯一索引與非唯一索引的差異假設(shè)索引 int1c1(c1)是唯一索引, 對(duì)于查詢語(yǔ)句 selectc1fromt1wherec1=1,達(dá)夢(mèng)數(shù)據(jù)庫(kù)使用索引鍵(1)命中 B 樹中一條記錄,命中之后直接返回該記錄(因?yàn)槭俏ㄒ凰饕宰疃嘀荒苡幸粭l c1=1 的記錄)。假設(shè)索引 it1c2(c2)是非唯一索引,對(duì)于查詢語(yǔ)句 selectc2fromt2wherec2=2,達(dá)夢(mèng)數(shù)據(jù)庫(kù)使用索引鍵(2)命中 B 樹中一條記錄,返回該記錄,并繼續(xù)向后掃描,如果該記錄是滿足 c=2,返回該記錄,繼續(xù)掃描,直到遇到第一條不符合條件 c2=2 的記錄。于是,我們可以得知,對(duì)于不存在重復(fù)值的列,創(chuàng)

25、建唯一索引優(yōu)于創(chuàng)建非唯一索引。4、非聚集索引的作用每張表只可能一個(gè)聚集索引,聚集索引用來組織真實(shí)數(shù)據(jù)。語(yǔ)句“createtableemployee(idintclusterprimarykey,namevarchar(20),addrvarchar(20)”。表 employee 的數(shù)據(jù)用 id 來組織。如果要查找 id=1000 的員工記錄,只要用索引鍵(1000)命中該聚集索引。但是,對(duì)于要查找 name=張三的員工記錄就不能使用該索引了,需要進(jìn)行全表掃描,對(duì)于每一條記錄判斷是否滿足 name=張三,這樣會(huì)導(dǎo)致查詢效率非常低。要使用聚集索引,必需提供 id,我們只能提供 name 于是需要引入一個(gè)輔助結(jié)構(gòu)實(shí)現(xiàn)nameiUid 的轉(zhuǎn)換,這就是非聚集索引的作用。該非聚集索引的鍵是 name 值是 id。于是語(yǔ)句“select*fromemployeewherename=張三”的執(zhí)行流程是: 通過鍵(張三)命中非聚集索引,得到對(duì)應(yīng)的 id 值 3(假設(shè)張三對(duì)應(yīng)的 id 為 3),然后用鍵命中聚集索引,得到相應(yīng)的記錄。5、是不是使用非聚集索引的查詢都

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論