成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

你怎么做mysql優(yōu)化的 mysql實(shí)戰(zhàn)優(yōu)化高手

mysql怎么優(yōu)化,都要怎么做

mysql優(yōu)化是一個(gè)大方向,大的是要分布式、讀寫(xiě)分離,小的是對(duì)sql語(yǔ)句進(jìn)行優(yōu)化。不過(guò)大多問(wèn)的也是對(duì)sql語(yǔ)句優(yōu)化,網(wǎng)上很多資料,我就大體說(shuō)說(shuō)。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、佳木斯網(wǎng)站維護(hù)、網(wǎng)站推廣。

1、explain+索引。

在你要查詢(xún)的語(yǔ)句前加explain,看下有沒(méi)有用到索引,如果出現(xiàn)type為all的,則說(shuō)明有必要添加下索引。(附多表查詢(xún)速度比較:表關(guān)聯(lián)existsin)慢查詢(xún)優(yōu)化是一大塊。

2、預(yù)統(tǒng)計(jì)。

很經(jīng)常需要對(duì)歷史的數(shù)據(jù)進(jìn)行過(guò)濾統(tǒng)計(jì)。比如移動(dòng)需要統(tǒng)計(jì)上個(gè)月電話(huà)小時(shí)數(shù)超過(guò)N小時(shí)的人,那么如果直接取原始數(shù)據(jù),那將很慢,此時(shí)如果每天晚上凌晨都對(duì)數(shù)據(jù)進(jìn)行預(yù)統(tǒng)計(jì),統(tǒng)計(jì)每個(gè)人每天電話(huà)時(shí)數(shù),那再來(lái)過(guò)濾就很快。

3、分表分區(qū)。

分表分區(qū)也是為了提高搜索速度。例如,公交車(chē)的gps行駛記錄,gps每隔15s報(bào)一次,一輛車(chē)一天運(yùn)行12小時(shí),一天就要插入4*60*12條記錄,N輛車(chē)就要再乘,其數(shù)量極大,所以經(jīng)常按月分表,分表里再按上報(bào)時(shí)間做日分區(qū),這樣就達(dá)到很大的優(yōu)化,想查詢(xún)某段時(shí)間,mysql很快就可以定位到。

4、表結(jié)構(gòu)。

表結(jié)構(gòu)很重要,經(jīng)常需要多表關(guān)聯(lián)查詢(xún)一些字段,有時(shí)可以冗余下放到同一張表。

mysql優(yōu)化很有意思,多去查閱些資料,多去嘗試,對(duì)你有好處的。

MySQL常用優(yōu)化方案

語(yǔ)句執(zhí)行后,會(huì)顯示三個(gè)字段: Query_ID(執(zhí)行ID) | Duration(持續(xù)時(shí)間)| Query(查詢(xún)語(yǔ)句) ;

拿到后Query_ID后,可執(zhí)行 show profile for query Query_ID ,查看詳細(xì)的準(zhǔn)備時(shí)間,執(zhí)行時(shí)間、執(zhí)行結(jié)束( preparing、executing、end )等。

顯示用戶(hù)正在運(yùn)行的線程,需要注意的是,除了 root 用戶(hù)能看到所有正在運(yùn)行的線程外,其他用戶(hù)都只能看到自己正在運(yùn)行的線程,看不到其它用戶(hù)正在運(yùn)行的線程。除非單獨(dú)個(gè)這個(gè)用戶(hù)賦予了PROCESS 權(quán)限。

顯示字段包含: User| Host| db | Command | Time| State| Info 等。

解析語(yǔ)句,查詢(xún)是否命中索引,及,命中何種索引,用以判斷是否符合我們的預(yù)期。

返回字段包含: select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra 等。

select_type 常見(jiàn)類(lèi)型:

(1) SIMPLE(簡(jiǎn)單SELECT,不使用UNION或子查詢(xún)等)

(2) PRIMARY(子查詢(xún)中最外層查詢(xún),查詢(xún)中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY)

(3) UNION(UNION中的第二個(gè)或后面的SELECT語(yǔ)句)

(4) SUBQUERY(子查詢(xún)中的第一個(gè)SELECT,結(jié)果不依賴(lài)于外部查詢(xún))

table 常見(jiàn)類(lèi)型:

顯示這一行的數(shù)據(jù)是關(guān)于哪張表的.

有時(shí)不是真實(shí)的表名字,看到的是derivedx(x是個(gè)數(shù)字,我的理解是第幾步執(zhí)行的結(jié)果)

type 常見(jiàn)類(lèi)型:

對(duì)表訪問(wèn)方式,表示MySQL在表中找到所需行的方式,又稱(chēng)“訪問(wèn)類(lèi)型”。

常用的類(lèi)型有: ALL、index、range、 ref、eq_ref、const、system、NULL (從左到右,性能從差到好)

possible_keys

指出MySQL能使用哪個(gè)索引在表中找到記錄,查詢(xún)涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢(xún)使用(該查詢(xún)可以利用的索引,如果沒(méi)有任何索引顯示 null)

該列完全獨(dú)立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實(shí)際上不能按生成的表次序使用。

如果該列是NULL,則沒(méi)有相關(guān)的索引。在這種情況下,可以通過(guò)檢查WHERE子句看是否它引用某些列或適合索引的列來(lái)提高你的查詢(xún)性能。如果是這樣,創(chuàng)造一個(gè)適當(dāng)?shù)乃饕⑶以俅斡肊XPLAIN檢查查詢(xún)

key

key列顯示MySQL實(shí)際決定使用的鍵(索引),必然包含在possible_keys中

如果沒(méi)有選擇索引,鍵是NULL。要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,在查詢(xún)中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

表示索引中使用的字節(jié)數(shù),可通過(guò)該列計(jì)算查詢(xún)中使用的索引的長(zhǎng)度,非實(shí)際長(zhǎng)度,為最大可能長(zhǎng)度。

注:不損失精確性的情況下,長(zhǎng)度越短越好。

ref

列與索引的比較,表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值。

rows

估算出結(jié)果集行數(shù),表示MySQL根據(jù)表統(tǒng)計(jì)信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù);

extra

該列包含MySQL解決查詢(xún)的詳細(xì)信息,有以下幾種情況:

(1).Distinct

一旦MYSQL找到了與行相聯(lián)合匹配的行,就不再搜索了

(2).Not exists

MYSQL優(yōu)化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標(biāo)準(zhǔn)的行,就不再搜索了

(3).Range checked for each

Record(index map:#)

沒(méi)有找到理想的索引,因此對(duì)于從前面表中來(lái)的每一個(gè)行組合,MYSQL檢查使用哪個(gè)索引,并用它來(lái)從表中返回行。這是使用索引的最慢的連接之一

(4).Using filesort

看到這個(gè)的時(shí)候,查詢(xún)就需要優(yōu)化了。MYSQL需要進(jìn)行額外的步驟來(lái)發(fā)現(xiàn)如何對(duì)返回的行排序。它根據(jù)連接類(lèi)型以及存儲(chǔ)排序鍵值和匹配條件的全部行的行指針來(lái)排序全部行;

(5).Using temporary

看到這個(gè)的時(shí)候,查詢(xún)需要優(yōu)化了。這里,MYSQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果,這通常發(fā)生在對(duì)不同的列集進(jìn)行ORDER BY上,而不是GROUP BY上;

(6).Using index

列數(shù)據(jù)是從僅僅使用了索引中的信息而沒(méi)有讀取實(shí)際的行動(dòng)的表返回的,這發(fā)生在對(duì)表的全部的請(qǐng)求列都是同一個(gè)索引的部分的時(shí)候。

(7).Using where

使用了WHERE從句來(lái)限制哪些行將與下一張表匹配或者是返回給用戶(hù)。如果不想返回表中的全部行,并且連接類(lèi)型ALL或index,這就會(huì)發(fā)生,或者是查詢(xún)有問(wèn)題。

超詳細(xì)MySQL數(shù)據(jù)庫(kù)優(yōu)化

數(shù)據(jù)庫(kù)優(yōu)化一方面是找出系統(tǒng)的瓶頸,提高M(jìn)ySQL數(shù)據(jù)庫(kù)的整體性能,而另一方面需要合理的結(jié)構(gòu)設(shè)計(jì)和參數(shù)調(diào)整,以提高用戶(hù)的相應(yīng)速度,同時(shí)還要盡可能的節(jié)約系統(tǒng)資源,以便讓系統(tǒng)提供更大的負(fù)荷.

1. 優(yōu)化一覽圖

2. 優(yōu)化

筆者將優(yōu)化分為了兩大類(lèi),軟優(yōu)化和硬優(yōu)化,軟優(yōu)化一般是操作數(shù)據(jù)庫(kù)即可,而硬優(yōu)化則是操作服務(wù)器硬件及參數(shù)設(shè)置.

2.1 軟優(yōu)化

2.1.1 查詢(xún)語(yǔ)句優(yōu)化

1.首先我們可以用EXPLAIN或DESCRIBE(簡(jiǎn)寫(xiě):DESC)命令分析一條查詢(xún)語(yǔ)句的執(zhí)行信息.

2.例:

顯示:

其中會(huì)顯示索引和查詢(xún)數(shù)據(jù)讀取數(shù)據(jù)條數(shù)等信息.

2.1.2 優(yōu)化子查詢(xún)

在MySQL中,盡量使用JOIN來(lái)代替子查詢(xún).因?yàn)樽硬樵?xún)需要嵌套查詢(xún),嵌套查詢(xún)時(shí)會(huì)建立一張臨時(shí)表,臨時(shí)表的建立和刪除都會(huì)有較大的系統(tǒng)開(kāi)銷(xiāo),而連接查詢(xún)不會(huì)創(chuàng)建臨時(shí)表,因此效率比嵌套子查詢(xún)高.

2.1.3 使用索引

索引是提高數(shù)據(jù)庫(kù)查詢(xún)速度最重要的方法之一,關(guān)于索引可以參高筆者M(jìn)ySQL數(shù)據(jù)庫(kù)索引一文,介紹比較詳細(xì),此處記錄使用索引的三大注意事項(xiàng):

2.1.4 分解表

對(duì)于字段較多的表,如果某些字段使用頻率較低,此時(shí)應(yīng)當(dāng),將其分離出來(lái)從而形成新的表,

2.1.5 中間表

對(duì)于將大量連接查詢(xún)的表可以創(chuàng)建中間表,從而減少在查詢(xún)時(shí)造成的連接耗時(shí).

2.1.6 增加冗余字段

類(lèi)似于創(chuàng)建中間表,增加冗余也是為了減少連接查詢(xún).

2.1.7 分析表,,檢查表,優(yōu)化表

分析表主要是分析表中關(guān)鍵字的分布,檢查表主要是檢查表中是否存在錯(cuò)誤,優(yōu)化表主要是消除刪除或更新造成的表空間浪費(fèi).

1. 分析表: 使用 ANALYZE 關(guān)鍵字,如ANALYZE TABLE user;

2. 檢查表: 使用 CHECK關(guān)鍵字,如CHECK TABLE user [option]

option 只對(duì)MyISAM有效,共五個(gè)參數(shù)值:

3. 優(yōu)化表:使用OPTIMIZE關(guān)鍵字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不寫(xiě)入日志.,優(yōu)化表只對(duì)VARCHAR,BLOB和TEXT有效,通過(guò)OPTIMIZE TABLE語(yǔ)句可以消除文件碎片,在執(zhí)行過(guò)程中會(huì)加上只讀鎖.

2.2 硬優(yōu)化

2.2.1 硬件三件套

1.配置多核心和頻率高的cpu,多核心可以執(zhí)行多個(gè)線程.

2.配置大內(nèi)存,提高內(nèi)存,即可提高緩存區(qū)容量,因此能減少磁盤(pán)I/O時(shí)間,從而提高響應(yīng)速度.

3.配置高速磁盤(pán)或合理分布磁盤(pán):高速磁盤(pán)提高I/O,分布磁盤(pán)能提高并行操作的能力.

2.2.2 優(yōu)化數(shù)據(jù)庫(kù)參數(shù)

優(yōu)化數(shù)據(jù)庫(kù)參數(shù)可以提高資源利用率,從而提高M(jìn)ySQL服務(wù)器性能.MySQL服務(wù)的配置參數(shù)都在my.cnf或my.ini,下面列出性能影響較大的幾個(gè)參數(shù).

2.2.3 分庫(kù)分表

因?yàn)閿?shù)據(jù)庫(kù)壓力過(guò)大,首先一個(gè)問(wèn)題就是高峰期系統(tǒng)性能可能會(huì)降低,因?yàn)閿?shù)據(jù)庫(kù)負(fù)載過(guò)高對(duì)性能會(huì)有影響。另外一個(gè),壓力過(guò)大把你的數(shù)據(jù)庫(kù)給搞掛了怎么辦?所以此時(shí)你必須得對(duì)系統(tǒng)做分庫(kù)分表 + 讀寫(xiě)分離,也就是把一個(gè)庫(kù)拆分為多個(gè)庫(kù),部署在多個(gè)數(shù)據(jù)庫(kù)服務(wù)上,這時(shí)作為主庫(kù)承載寫(xiě)入請(qǐng)求。然后每個(gè)主庫(kù)都掛載至少一個(gè)從庫(kù),由從庫(kù)來(lái)承載讀請(qǐng)求。

2.2.4 緩存集群

如果用戶(hù)量越來(lái)越大,此時(shí)你可以不停的加機(jī)器,比如說(shuō)系統(tǒng)層面不停加機(jī)器,就可以承載更高的并發(fā)請(qǐng)求。然后數(shù)據(jù)庫(kù)層面如果寫(xiě)入并發(fā)越來(lái)越高,就擴(kuò)容加數(shù)據(jù)庫(kù)服務(wù)器,通過(guò)分庫(kù)分表是可以支持?jǐn)U容機(jī)器的,如果數(shù)據(jù)庫(kù)層面的讀并發(fā)越來(lái)越高,就擴(kuò)容加更多的從庫(kù)。但是這里有一個(gè)很大的問(wèn)題:數(shù)據(jù)庫(kù)其實(shí)本身不是用來(lái)承載高并發(fā)請(qǐng)求的,所以通常來(lái)說(shuō),數(shù)據(jù)庫(kù)單機(jī)每秒承載的并發(fā)就在幾千的數(shù)量級(jí),而且數(shù)據(jù)庫(kù)使用的機(jī)器都是比較高配置,比較昂貴的機(jī)器,成本很高。如果你就是簡(jiǎn)單的不停的加機(jī)器,其實(shí)是不對(duì)的。所以在高并發(fā)架構(gòu)里通常都有緩存這個(gè)環(huán)節(jié),緩存系統(tǒng)的設(shè)計(jì)就是為了承載高并發(fā)而生。所以單機(jī)承載的并發(fā)量都在每秒幾萬(wàn),甚至每秒數(shù)十萬(wàn),對(duì)高并發(fā)的承載能力比數(shù)據(jù)庫(kù)系統(tǒng)要高出一到兩個(gè)數(shù)量級(jí)。所以你完全可以根據(jù)系統(tǒng)的業(yè)務(wù)特性,對(duì)那種寫(xiě)少讀多的請(qǐng)求,引入緩存集群。具體來(lái)說(shuō),就是在寫(xiě)數(shù)據(jù)庫(kù)的時(shí)候同時(shí)寫(xiě)一份數(shù)據(jù)到緩存集群里,然后用緩存集群來(lái)承載大部分的讀請(qǐng)求。這樣的話(huà),通過(guò)緩存集群,就可以用更少的機(jī)器資源承載更高的并發(fā)。

一個(gè)完整而復(fù)雜的高并發(fā)系統(tǒng)架構(gòu)中,一定會(huì)包含:各種復(fù)雜的自研基礎(chǔ)架構(gòu)系統(tǒng)。各種精妙的架構(gòu)設(shè)計(jì).因此一篇小文頂多具有拋磚引玉的效果,但是數(shù)據(jù)庫(kù)優(yōu)化的思想差不多就這些了.

怎么進(jìn)行mysql數(shù)據(jù)庫(kù)優(yōu)化?

有八個(gè)方面可以對(duì)mysql進(jìn)行優(yōu)化:

1、選取最適用的字段屬性

MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說(shuō)來(lái),數(shù)據(jù)庫(kù)中的表越小,在它上面執(zhí)行的查詢(xún)也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。

2. 使用連接(JOIN)來(lái)代替子查詢(xún)(Sub-Queries)

MySQL從4.1開(kāi)始支持SQL的子查詢(xún)。這個(gè)技術(shù)可以使用SELECT語(yǔ)句來(lái)創(chuàng)建一個(gè)單列的查詢(xún)結(jié)果,然后把這個(gè)結(jié)果作為過(guò)濾條件用在另一個(gè)查詢(xún)中。

3、使用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表

MySQL從4.0的版本開(kāi)始支持union查詢(xún),它可以把需要使用臨時(shí)表的兩條或更多的select查詢(xún)合并的一個(gè)查詢(xún)中。在客戶(hù)端的查詢(xún)會(huì)話(huà)結(jié)束的時(shí)候,臨時(shí)表會(huì)被自動(dòng)刪除,從而保證數(shù)據(jù)庫(kù)整齊、高效。

4、事務(wù)

盡管我們可以使用子查詢(xún)(Sub-Queries)、連接(JOIN)和聯(lián)合(UNION)來(lái)創(chuàng)建各種各樣的查詢(xún),但不是所有的數(shù)據(jù)庫(kù)操作都可以只用一條或少數(shù)幾條SQL語(yǔ)句就可以完成的。更多的時(shí)候是需要用到一系列的語(yǔ)句來(lái)完成某種工作。但是在這種情況下,當(dāng)這個(gè)語(yǔ)句塊中的某一條語(yǔ)句運(yùn)行出錯(cuò)的時(shí)候,整個(gè)語(yǔ)句塊的操作就會(huì)變得不確定起來(lái)。設(shè)想一下,要把某個(gè)數(shù)據(jù)同時(shí)插入兩個(gè)相關(guān)聯(lián)的表中,可能會(huì)出現(xiàn)這樣的情況:第一個(gè)表中成功更新后,數(shù)據(jù)庫(kù)突然出現(xiàn)意外狀況,造成第二個(gè)表中的操作沒(méi)有完成,這樣,就會(huì)造成數(shù)據(jù)的不完整,甚至?xí)茐臄?shù)據(jù)庫(kù)中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么語(yǔ)句塊中每條語(yǔ)句都操作成功,要么都失敗

5、鎖定表

盡管事務(wù)是維護(hù)數(shù)據(jù)庫(kù)完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會(huì)影響數(shù)據(jù)庫(kù)的性能,尤其是在很大的應(yīng)用系統(tǒng)中。由于在事務(wù)執(zhí)行的過(guò)程中,數(shù)據(jù)庫(kù)將會(huì)被鎖定,因此其它的用戶(hù)請(qǐng)求只能暫時(shí)等待直到該事務(wù)結(jié)束。其實(shí),有些情況下我們可以通過(guò)鎖定表的方法來(lái)獲得更好的性能。

6、使用外鍵

鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵。

7、使用索引

索引是提高數(shù)據(jù)庫(kù)性能的常用方法,它可以令數(shù)據(jù)庫(kù)服務(wù)器以比沒(méi)有索引快得多的速度檢索特定的行,尤其是在查詢(xún)語(yǔ)句當(dāng)中包含有MAX(),MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯。

8、優(yōu)化的查詢(xún)語(yǔ)句

絕大多數(shù)情況下,使用索引可以提高查詢(xún)的速度,但如果SQL語(yǔ)句使用不恰當(dāng)?shù)脑?huà),索引將無(wú)法發(fā)揮它應(yīng)有的作用。

網(wǎng)頁(yè)名稱(chēng):你怎么做mysql優(yōu)化的 mysql實(shí)戰(zhàn)優(yōu)化高手
文章地址:http://jinyejixie.com/article10/dopcgdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化網(wǎng)站建設(shè)、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
香格里拉县| 宜丰县| 北票市| 东台市| 花莲市| 麦盖提县| 康定县| 开封县| 枞阳县| 常山县| 长兴县| 冀州市| 纳雍县| 庐江县| 南皮县| 喀什市| 长岛县| 界首市| 华亭县| 惠州市| 新干县| 新和县| 杨浦区| 广安市| 天祝| 长乐市| 万载县| 资兴市| 高陵县| 石泉县| 卓资县| 利辛县| 广德县| 泌阳县| 普格县| 湘潭县| 潮州市| 三穗县| 浦县| 萍乡市| 亳州市|