久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何提高mysql數(shù)據(jù)庫的性能

共計(jì) 3312 個(gè)字符,預(yù)計(jì)需要花費(fèi) 9 分鐘才能閱讀完成。

這篇文章主要講解了“如何提高 mysql 數(shù)據(jù)庫的性能”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何提高 mysql 數(shù)據(jù)庫的性能”吧!

提高 mysql 數(shù)據(jù)庫性能的方法有哪些

一、問題的提出

在應(yīng)用系統(tǒng)開發(fā)初期,由于開發(fā)數(shù)據(jù)庫數(shù)據(jù)比較少,對(duì)于查詢 SQL 語句,復(fù)雜視圖的的編寫等體會(huì)不出 SQL 語句各種寫法的性能優(yōu)劣,但是如果將應(yīng)用系統(tǒng)提交實(shí)際應(yīng)用后,隨著數(shù)據(jù)庫中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度就成為目前系統(tǒng)需要解決的最主要的問題之一。系統(tǒng)優(yōu)化中一個(gè)很重要的方面就是 SQL 語句的優(yōu)化。對(duì)于海量數(shù)據(jù),劣質(zhì) SQL 語句和優(yōu)質(zhì) SQL 語句之間的速度差別可以達(dá)到上百倍,可見對(duì)于一個(gè)系統(tǒng)不是簡單地能實(shí)現(xiàn)其功能就可,而是要寫出高質(zhì)量的 SQL 語句,提高系統(tǒng)的可用性。

在多數(shù)情況下,Oracle 使用索引來更快地遍歷表,優(yōu)化器主要根據(jù)定義的索引來提高性能。但是,如果在 SQL 語句的 where 子句中寫的 SQL 代碼不合理,就會(huì)造成優(yōu)化器刪去索引而使用全表掃描,一般就這種 SQL 語句就是所謂的劣質(zhì) SQL 語句。在編寫 SQL 語句時(shí)我們應(yīng)清楚優(yōu)化器根據(jù)何種原則來刪除索引,這有助于寫出高性能的 SQL 語句。

二、SQL 語句編寫注意問題

下面就某些 SQL 語句的 where 子句編寫中需要注意的問題作詳細(xì)介紹。在這些 where 子句中,即使某些列存在索引,但是由于編寫了劣質(zhì)的 SQL,系統(tǒng)在運(yùn)行該 SQL 語句時(shí)也不能使用該索引,而同樣使用全表掃描,這就造成了響應(yīng)速度的極大降低。

1.ISNULL 與 ISNOTNULL

不能用 null 作索引,任何包含 null 值的列都將不會(huì)被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有 null,該列就會(huì)從索引中排除。也就是說如果某列存在空值,即使對(duì)該列建索引也不會(huì)提高性能。

任何在 where 子句中使用 isnull 或 isnotnull 的語句優(yōu)化器是不允許使用索引的。

2. 聯(lián)接列

對(duì)于有聯(lián)接的列,即使最后的聯(lián)接值為一個(gè)靜態(tài)值,優(yōu)化器是不會(huì)使用索引的。我們一起來看一個(gè)例子,假定有一個(gè)職工表 (employee),對(duì)于一個(gè)職工的姓和名分成兩列存放(FIRST_NAME 和 LAST_NAME),現(xiàn)在要查詢一個(gè)叫比爾. 克林頓(BillCliton) 的職工。

下面是一個(gè)采用聯(lián)接查詢的 SQL 語句,

select*fromemployss

where

first_name|| ||last_name= BeillCliton

上面這條語句完全可以查詢出是否有 BillCliton 這個(gè)員工,但是這里需要注意,系統(tǒng)優(yōu)化器對(duì)基于 last_name 創(chuàng)建的索引沒有使用。

當(dāng)采用下面這種 SQL 語句的編寫,Oracle 系統(tǒng)就可以采用基于 last_name 創(chuàng)建的索引。

Select*fromemployee

where

first_name= Beill andlast_name= Cliton

遇到下面這種情況又如何處理呢? 如果一個(gè)變量 (name) 中存放著 BillCliton 這個(gè)員工的姓名,對(duì)于這種情況我們又如何避免全程遍歷,使用索引呢? 可以使用一個(gè)函數(shù),將變量 name 中的姓和名分開就可以了,但是有一點(diǎn)需要注意,這個(gè)函數(shù)是不能作用在索引列上。下面是 SQL 查詢腳本:

select*fromemployee

where

first_name=SUBSTR(name ,1,INSTR( name ,)-1)

and

last_name=SUBSTR(name ,INSTR( name’,)+1)

3. 帶通配符 (%) 的 like 語句

同樣以上面的例子來看這種情況。目前的需求是這樣的,要求在職工表中查詢名字中包含 cliton 的人。可以采用如下的查詢 SQL 語句:

select*fromemployeewherelast_namelike %cliton%

這里由于通配符 (%) 在搜尋詞首出現(xiàn),所以 Oracle 系統(tǒng)不使用 last_name 的索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會(huì)降低查詢速度。然而當(dāng)通配符出現(xiàn)在字符串其他位置時(shí),優(yōu)化器就能利用索引。在下面的查詢中索引得到了使用:

select*fromemployeewherelast_namelike c%

4.Orderby 語句

ORDERBY 語句決定了 Oracle 如何將返回的查詢結(jié)果排序。Orderby 語句對(duì)要排序的列沒有什么特別的限制,也可以將函數(shù)加入列中(象聯(lián)接或者附加等)。任何在 Orderby 語句的非索引項(xiàng)或者有計(jì)算表達(dá)式都將降低查詢速度。

仔細(xì)檢查 orderby 語句以找出非索引項(xiàng)或者表達(dá)式,它們會(huì)降低性能。解決這個(gè)問題的辦法就是重寫 orderby 語句以使用索引,也可以為所使用的列建立另外一個(gè)索引,同時(shí)應(yīng)絕對(duì)避免在 orderby 子句中使用表達(dá)式。

5.NOT

我們?cè)诓樵儠r(shí)經(jīng)常在 where 子句使用一些邏輯表達(dá)式,如大于、小于、等于以及不等于等等,也可以使用 and(與)、or(或)以及 not(非)。NOT 可用來對(duì)任何邏輯運(yùn)算符號(hào)取反。下面是一個(gè) NOT 子句的例子:

…wherenot(status= VALID)

如果要使用 NOT,則應(yīng)在取反的短語前面加上括號(hào),并在短語前面加上 NOT 運(yùn)算符。NOT 運(yùn)算符包含在另外一個(gè)邏輯運(yùn)算符中,這就是不等于 () 運(yùn)算符。換句話說,即使不在查詢 where 子句中顯式地加入 NOT 詞,NOT 仍在運(yùn)算符中,見下例:

…wherestatus INVALID

再看下面這個(gè)例子:

select*fromemployeewheresalary 3000;

對(duì)這個(gè)查詢,可以改寫為不使用 NOT:

select*fromemployeewheresalary 3000orsalary 3000;

雖然這兩種查詢的結(jié)果一樣,但是第二種查詢方案會(huì)比第一種查詢方案更快些。第二種查詢?cè)试S Oracle 對(duì) salary 列使用索引,而第一種查詢則不能使用索引。

6.IN 和 EXISTS

有時(shí)候會(huì)將一列和一系列值相比較。最簡單的辦法就是在 where 子句中使用子查詢。在 where 子句中可以使用兩種格式的子查詢。

第一種格式是使用 IN 操作符:

…wherecolumnin(select*from…where…);

第二種格式是使用 EXIST 操作符:

…whereexists(select X from…where…);

我相信絕大多數(shù)人會(huì)使用第一種格式,因?yàn)樗容^容易編寫,而實(shí)際上第二種格式要遠(yuǎn)比第一種格式的效率高。在 Oracle 中可以幾乎將所有的 IN 操作符子查詢改寫為使用 EXISTS 的子查詢。

第二種格式中,子查詢以‘select X 開始。運(yùn)用 EXISTS 子句不管子查詢從表中抽取什么數(shù)據(jù)它只查看 where 子句。這樣優(yōu)化器就不必遍歷整個(gè)表而僅根據(jù)索引就可完成工作(這里假定在 where 語句中使用的列存在索引)。相對(duì)于 IN 子句來說,EXISTS 使用相連子查詢,構(gòu)造起來要比 IN 子查詢困難一些。

通過使用 EXIST,Oracle 系統(tǒng)會(huì)首先檢查主查詢,然后運(yùn)行子查詢直到它找到第一個(gè)匹配項(xiàng),這就節(jié)省了時(shí)間。Oracle 系統(tǒng)在執(zhí)行 IN 子查詢時(shí),首先執(zhí)行子查詢,并將獲得的結(jié)果列表存放在在一個(gè)加了索引的臨時(shí)表中。在執(zhí)行子查詢之前,系統(tǒng)先將主查詢掛起,待子查詢執(zhí)行完畢,存放在臨時(shí)表中以后再執(zhí)行主查詢。這也就是使用 EXISTS 比使用 IN 通常查詢速度快的原因。

同時(shí)應(yīng)盡可能使用 NOTEXISTS 來代替 NOTIN,盡管二者都使用了 NOT(不能使用索引而降低速度),NOTEXISTS 要比 NOTIN 查詢效率更高。

關(guān)于提高 mysql 數(shù)據(jù)庫性能的方法就為大家總結(jié)這么多,相信大家通過上文的學(xué)習(xí)之后對(duì) mysql 數(shù)據(jù)庫的性能的提高有所了解,掌握了方法就可以在以后的工作中輕松實(shí)現(xiàn) mysql 數(shù)據(jù)庫的性能提高,希望上文中涉及到的內(nèi)容對(duì)大家能夠有所幫助。

感謝各位的閱讀,以上就是“如何提高 mysql 數(shù)據(jù)庫的性能”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何提高 mysql 數(shù)據(jù)庫的性能這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-01發(fā)表,共計(jì)3312字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 洛隆县| 湘西| 澄城县| 来安县| 高州市| 长沙市| 施甸县| 庆元县| 辉南县| 阜阳市| 舞阳县| 拉孜县| 长治市| 安宁市| 开远市| 大庆市| 富顺县| 崇文区| 类乌齐县| 仪征市| 遂平县| 巩义市| 哈巴河县| 读书| 松桃| 惠东县| 宁夏| 绿春县| 诸暨市| 遵化市| 宝鸡市| 沧州市| 博乐市| 许昌县| 富蕴县| 双流县| 武鸣县| 仪征市| 岳普湖县| 天门市| 松阳县|