數(shù)據(jù)庫性能優(yōu)化的五種方案_第1頁
數(shù)據(jù)庫性能優(yōu)化的五種方案_第2頁
數(shù)據(jù)庫性能優(yōu)化的五種方案_第3頁
數(shù)據(jù)庫性能優(yōu)化的五種方案_第4頁
數(shù)據(jù)庫性能優(yōu)化的五種方案_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

5/5數(shù)據(jù)庫性能優(yōu)化的五種方案數(shù)據(jù)庫性能優(yōu)化的五種方案

文檔修訂

目錄

數(shù)據(jù)庫性能優(yōu)化的五種方案(1)

1.概述(4)

1.1.目的(4)

1.2.閱讀對象(4)

1.3.名詞解釋(4)

1.4.轉(zhuǎn)載出處(4)

2.操作步驟(4)

(4)

2.1.建立索引(5)

2.1.1.Mysql索引概念(5)

2.1.2.Mysql索引主要有兩種結(jié)構(gòu):B+樹和hash(5)

2.1.

3.Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引

(5)

2.1.4.Mysql各種索引區(qū)別(6)

2.1.5.INNODB與MyISAM兩種表存儲引擎區(qū)別(6)

2.2.優(yōu)化SQL語句(6)

2.2.1.常用策略(6)

2.2.2.實(shí)例案例分析(9)

2.3.優(yōu)化表結(jié)構(gòu)(9)

2.4.表的拆分(10)

2.5.分庫(10)

1.概述

1.1.目的

數(shù)據(jù)庫性能優(yōu)化

1.2.閱讀對象

1.3.名詞解釋

1.4.轉(zhuǎn)載出處

https://http://./doc/f42507f4effdc8d376eeaeaad1f34693daef1090.html/csflvcxx/article/details/81279024

2.操作步驟

關(guān)系型數(shù)據(jù)庫在互聯(lián)網(wǎng)項(xiàng)目中應(yīng)用極為廣泛,今天就和大家分享幾個數(shù)據(jù)庫優(yōu)化的幾種方案。

2.1.建立索引

數(shù)據(jù)庫優(yōu)化第一步就是建立合理的索引,這也是最初級的優(yōu)化,也是DBA常用的優(yōu)化方案!MySql索引類型有:普通索引,主鍵索引,唯一索引,組合索引!

2.1.1.Mysql索引概念

說說Mysql索引,看到一個很少比如:索引就好比一本書的目錄,它會讓你更快的找到內(nèi)容,顯然目錄(索引)并不是越多越好,假如這本書1000頁,有500也是目錄,它當(dāng)然效率低,目錄是要占紙張的,而索引是要占磁盤空間的。

2.1.2.Mysql索引主要有兩種結(jié)構(gòu):B+樹和hash

hash:hash索引在mysql比較少用,他以把數(shù)據(jù)的索引以hash形式組織起來,因此當(dāng)查找某一條記錄的時(shí)候,速度非常快.當(dāng)時(shí)因?yàn)槭莌ash結(jié)構(gòu),每個鍵只對應(yīng)一個值,而且是散列的方式分布.所以他并不支持范圍查找和排序等功能.

B+樹:b+tree是mysql使用最頻繁的一個索引數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)以平衡樹的形式來組織,因?yàn)槭菢湫徒Y(jié)構(gòu),所以更適合用來處理排序,范圍查找等功能.相對hash索引,B+樹在查找單條記錄的速度雖然比不上hash索引,但是因?yàn)楦m合排序等操作,所以他更受用戶的歡迎.畢竟不可能只對數(shù)據(jù)庫進(jìn)行單條記錄的操作.

2.1.

3.Mysql常見索引有:主鍵索引、唯一索引、普通索

引、全文索引、組合索引

PRIMARYKEY(主鍵索引)ALTERTABLEtable_nameADDPRIMARYKEY(column)UNIQUE(唯一索引)ALTERTABLEtable_nameADDUNIQUE(column)

INDEX(普通索引)ALTERTABLEtable_nameADDINDEXindex_name(column)

FULLTEXT(全文索引)ALTERTABLEtable_nameADDFULLTEXT(column)

組合索引ALTERTABLEtable_nameADDINDEXindex_name(column1,column2,column3)

2.1.4.Mysql各種索引區(qū)別

普通索引:最基本的索引,沒有任何限制。

唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。

主鍵索引:它是一種特殊的唯一索引,不允許有空值。

全文索引:僅可用于MyISAM表,針對較大的數(shù)據(jù),生成全文索引很耗時(shí)好空間。

組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。

2.1.5.INNODB與MyISAM兩種表存儲引擎區(qū)別

mysql數(shù)據(jù)庫分類為INNODB為MyISAM兩種表存儲引擎了,常見的mysql表引擎有INNODB和MyISAM,主要的區(qū)別是INNODB適合頻繁寫數(shù)據(jù)庫操作,MyISAM適合讀取數(shù)據(jù)庫的情況多一點(diǎn)。

2.2.優(yōu)化SQL語句

從業(yè)務(wù)角度,優(yōu)化SQL語句;這里給大家分享一個例子,查詢?nèi)齻€小時(shí)內(nèi),未處理的訂單;使用一條SQL語句的效率要遠(yuǎn)遠(yuǎn)低于使用18條SQL語句,每條SQL語句搜取10分鐘;

2.2.1.常用策略

(i)核心要點(diǎn)

●使用索引;

●避免全表掃描;

●避免新增和刪除時(shí)鎖表,影響查詢;

(ii)詳細(xì)清單

1.對查詢進(jìn)行優(yōu)化,要盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。

2.應(yīng)盡量避免在where子句中對字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:

selectidfromtwherenumisnull

最好不要給數(shù)據(jù)庫留NULL,盡可能的使用NOTNULL填充數(shù)據(jù)庫.

備注、描述、評論之類的可以設(shè)置為NULL,其他的,最好不要使用NULL。

不要以為NULL不需要空間,比如:char(100)型,在字段建立時(shí),空間就固定了,不管是否插入值(NULL也包含在內(nèi)),都是占用100個字符的空間的,如果是varchar這樣的變長字段,null不占用空間。

可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:

selectidfromtwherenum=0

3.應(yīng)盡量避免在where子句中使用!=或='2005-11-30'andcreatedate<'2005-12-1'

10.不要在where子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無法正確使用索引。

11.在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會被使用,并且應(yīng)盡可能的讓字段順序與索引順序相一致。

12.不要寫一些沒有意義的查詢,如需要生成一個空表結(jié)構(gòu):

selectcol1,col2into#tfromtwhere1=0

這類代碼不會返回任何結(jié)果集,但是會消耗系統(tǒng)資源的,應(yīng)改成這樣:

createtable#t(…)

13.Update語句,如果只更改1、2個字段,不要Update全部字段,否則頻繁調(diào)用會引起明顯的性能消耗,同時(shí)帶來大量日志。

14.對于多張大數(shù)據(jù)量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

15.selectcount(*)fromtable;這樣不帶任何條件的count會引起全表掃描,并且沒有任何業(yè)務(wù)意義,是一定要杜絕的。

16.索引并不是越多越好,索引固然可以提高相應(yīng)的select的效率,但同時(shí)也降低了insert及update的效率,因?yàn)閕nsert或update時(shí)有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數(shù)最好不要超過6個,若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。

17.應(yīng)盡可能的避免更新clustered索引數(shù)據(jù)列,因?yàn)閏lustered索引數(shù)據(jù)列的順序就是表記錄的物理存儲順序,一旦該列值改變將導(dǎo)致整個表記錄的順序的調(diào)整,會耗費(fèi)相當(dāng)大的資源。若應(yīng)用系統(tǒng)需要頻繁更新clustered索引數(shù)據(jù)列,那么需要考慮是否應(yīng)將該索引建為clustered索引。

18.盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。

19.盡可能的使用varchar/nvarchar代替char/nchar,因?yàn)槭紫茸冮L字段存儲空間小,可以節(jié)省存儲空間,其次對于查詢來說,在一個相對較小的字段內(nèi)搜索效率顯然要高些。

20.任何地方都不要使用select*fromt,用具體的字段列表代替“*”,不要返回用不到的任何字段。

21.盡量使用表變量來代替臨時(shí)表。如果表變量包含大量數(shù)據(jù),請注意索引非常有限(只有主鍵索引)。

22.避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。臨時(shí)表并不是不可使用,適當(dāng)?shù)厥褂盟鼈兛梢允鼓承├谈行В?,?dāng)需要重復(fù)引用大型表或常用表中的某個數(shù)據(jù)集時(shí)。但是,對于一次性事件,最好使用導(dǎo)出表。

23.在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先createtable,然后insert。

24.如果使用到了臨時(shí)表,在存儲過程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先truncatetable,然后droptable,這樣可以避免系統(tǒng)表的較長時(shí)間鎖定。

25.盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過1萬行,那么就應(yīng)該考慮改寫。

26.使用基于游標(biāo)的方法或臨時(shí)表方法之前,應(yīng)先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。

27.與臨時(shí)表一樣,游標(biāo)并不是不可使用。對小型數(shù)據(jù)集使用FAST_FORWARD游標(biāo)通常要優(yōu)于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數(shù)據(jù)時(shí)。在結(jié)果集中包括

“合計(jì)”的例程通常要比使用游標(biāo)執(zhí)行的速度快。如果開發(fā)時(shí)間允許,基于游標(biāo)的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。

28.在所有的存儲過程和觸發(fā)器的開始處設(shè)置SETNOCOUNTON,在結(jié)束時(shí)設(shè)置SETNOCOUNTOFF。無需在執(zhí)行存儲過程和觸發(fā)器的每個語句后向客戶端發(fā)送DONE_IN_PROC消息。

29.盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。

30.盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理。

2.2.2.實(shí)例案例分析

拆分大的DELETE或INSERT語句,批量提交SQL語句

如果你需要在一個在線的網(wǎng)站上去執(zhí)行一個大的DELETE或INSERT查詢,你需要非常小心,要避免你的操作讓你的整個網(wǎng)站停止響應(yīng)。因?yàn)檫@兩個操作是會鎖表的,表一鎖住了,別的操作都進(jìn)不來了。

Apache會有很多的子進(jìn)程或線程。所以,其工作起來相當(dāng)有效率,而我們的服務(wù)器也不希望有太多的子進(jìn)程,線程和數(shù)據(jù)庫鏈接,這是極大的占服務(wù)器資源的事情,尤其是內(nèi)存。

如果你把你的表鎖上一段時(shí)間,比如30秒鐘,那么對于一個有很高訪問量的站點(diǎn)來說,這30秒所積累的訪問進(jìn)程/線程,數(shù)據(jù)庫鏈接,打開的文件數(shù),可能不僅僅會讓你的WEB服務(wù)崩潰,還可能會讓你的整臺服務(wù)器馬上掛了。

所以,如果你有一個大的處理,你一定把其拆分,使用LIMIToracle(rownum),sqlserver(top)條件是一個好的方法。下面是一個mysql示例:

2.3.優(yōu)化表結(jié)構(gòu)

能用小字段類型,就盡量用小字段類型;如能用short,就不要用int;能用數(shù)字類型,

就不要用字符串類型,舉個例子,

溫馨提示

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

評論

0/150

提交評論