詳情描述
數(shù)據(jù)庫(kù)優(yōu)化是一個(gè)很廣的范圍,涉及到的東西比較多,并且每個(gè)特定的數(shù)據(jù)庫(kù),其具體的優(yōu)化過程也是不一樣的。
一般情況下,數(shù)據(jù)庫(kù)的優(yōu)化指的就是查詢性能的優(yōu)化(雖然嚴(yán)格上來說不應(yīng)該是這樣的),讓數(shù)據(jù)庫(kù)對(duì)查詢的響應(yīng)盡可能的快。僅對(duì)數(shù)據(jù)庫(kù)系統(tǒng)本身而言,影響到查詢性能的因素從理論上來講,包括數(shù)據(jù)庫(kù)參數(shù)設(shè)置(其實(shí)就是通過參數(shù)控制數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)存,io,緩存,備份等一些管理性的東西),索引,分區(qū),sql語句.數(shù)據(jù)庫(kù)參數(shù)設(shè)置本身是一個(gè)很復(fù)雜的東西,分區(qū)則主要是針對(duì)大數(shù)據(jù)量的情況下,它分散了數(shù)據(jù)文件的分布,減少磁盤競(jìng)爭(zhēng),使效率得到提升。
數(shù)據(jù)庫(kù)優(yōu)化:
1、查詢出的數(shù)據(jù)量過大(可以采用多次查詢,其他的方法降低數(shù)據(jù)量),盡量采取分頁(yè)查詢數(shù)據(jù)
2、鎖或者死鎖(這也是查詢慢常見的問題,是程序設(shè)計(jì)的缺陷)
3、返回了不必要的行和列
用OR的字句可以分解成多個(gè)查詢,并且通過UNION鏈接多個(gè)查詢。它們的速度只與是否使用索引有關(guān),如果查詢需要用到聯(lián)合索引,用UNION all執(zhí)行的效率更高。
4、如果是使用like進(jìn)行查詢的話,簡(jiǎn)單的使用index是不行的,但是全文索引,耗空間。like a% 使用索引like %a 不使用索引用like %a% 查詢時(shí),查詢耗時(shí)和字段值總長(zhǎng)度成正比,所以不能用CHAR類型,而是對(duì)于字段的值很長(zhǎng)的建全文索引。
5、盡量將數(shù)據(jù)的處理工作放在服務(wù)器上,減少網(wǎng)絡(luò)的開銷,如使用存儲(chǔ)過程。存儲(chǔ)過程是編譯、優(yōu)化過,并且被組織到一個(gè)執(zhí)行規(guī)劃里,且存儲(chǔ)在數(shù)據(jù)庫(kù)中的SQL語句(存儲(chǔ)過程是數(shù)據(jù)庫(kù)服務(wù)器端的一段程序),是控制流語言的集合,速度當(dāng)然快。
6、將需要查詢的結(jié)果預(yù)先計(jì)算好放在表中,查詢的時(shí)候再Select。這在SQL7.0以前是較重要的手段。例如計(jì)算商品購(gòu)買小計(jì)計(jì)算。
7、沒有必要時(shí)不要用DISTINCT和ORDER BY,這些動(dòng)作可以改在客戶端執(zhí)行。它們?cè)黾恿祟~外的開銷。這同UNION和UNION ALL一樣的道理。
8、一次更新多條記錄比分多次更新每次一條快,就是說批處理好
9、用臨時(shí)表,盡量用結(jié)果集和Table類性的變量來代替它,Table 類型的變量比臨時(shí)表好
10、數(shù)據(jù)庫(kù)設(shè)計(jì):數(shù)據(jù)庫(kù)內(nèi)所有表結(jié)構(gòu)均添加索引
調(diào)整原因:
近日數(shù)據(jù)庫(kù)壓力很大,經(jīng)查有些大數(shù)據(jù)量表的查詢速度很慢,導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器CPU一直持續(xù)將這些表添加索引后,CPU很快變正常。
根據(jù)查詢條件,建立索引,優(yōu)化索引、優(yōu)化訪問方式,限制結(jié)果集的數(shù)據(jù)量。注意填充因子要適當(dāng)(較好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小的列建索引好(參照索引的創(chuàng)建),不要對(duì)有限的幾個(gè)值的字段建單一索引如性別字段
11、將大數(shù)據(jù)表做分庫(kù)、分區(qū)處理:
具體操作如下:
1)、將大數(shù)據(jù)表與主數(shù)據(jù)庫(kù)分離,單獨(dú)新建一個(gè)數(shù)據(jù)庫(kù),然后將這些表做分區(qū);
2)、將數(shù)據(jù)插入到消息隊(duì)列內(nèi),后臺(tái)利用windows計(jì)劃任務(wù)執(zhí)行(5分鐘執(zhí)行一次)C控制臺(tái)程序?qū)⑾㈥?duì)列內(nèi)的數(shù)據(jù)批量(消息隊(duì)列內(nèi)有50000條記錄,一次性插入到數(shù)據(jù)表內(nèi))插入到相應(yīng)的數(shù)據(jù)表內(nèi);
調(diào)整原因:
例如:用戶訪問日志,每次用戶訪問一個(gè)頁(yè)面的時(shí)候我們之前的操作是直接將數(shù)據(jù)插入數(shù)據(jù)庫(kù),這樣做對(duì)數(shù)據(jù)庫(kù)的訪問及操作太大,嚴(yán)重影響其他數(shù)據(jù)插入、查詢的效率,利用分庫(kù)、分區(qū)、消息隊(duì)列完成此操作的好處是用戶訪問頁(yè)面的時(shí)候不直接對(duì)數(shù)據(jù)庫(kù)操作,而是在消息隊(duì)列內(nèi)積累一定數(shù)量的數(shù)據(jù)后批量插入數(shù)據(jù)庫(kù),只執(zhí)行一次數(shù)據(jù)庫(kù)操作,而且因?yàn)閿?shù)據(jù)庫(kù)分離的原因,對(duì)其他的查詢及插入不會(huì)有影響。
千鋒教育:
千鋒成都校區(qū):
成都校區(qū)地址:成都市武侯區(qū)科華北路62號(hào)力寶大廈N(北樓)18樓
聯(lián)系人:許老師
面授課程:全棧Web開發(fā)+培訓(xùn)、全鏈路設(shè)計(jì)培訓(xùn)、PHP全棧+服務(wù)器集群培訓(xùn)、JavaEE+分布式開發(fā)培訓(xùn)、大數(shù)據(jù)+人工智能培訓(xùn)、Unity游戲開發(fā)培訓(xùn)、Python培訓(xùn)、云計(jì)算+Python運(yùn)維培訓(xùn)、全棧軟件測(cè)試培訓(xùn)、Android培訓(xùn)、iOS培訓(xùn)、好程序員