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

mysql怎么優(yōu)化性能,mysql的性能優(yōu)化方案有哪些

怎樣優(yōu)化“mysql數(shù)據(jù)庫”來提高“mysql性能”?

優(yōu)化“mysql數(shù)據(jù)庫”來提高“mysql性能”的方法有:

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)靜寧,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

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

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

2、使用連接(JOIN)來代替子查詢(Sub-Queries)。

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

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

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

4、事務(wù)。

要把某個(gè)數(shù)據(jù)同時(shí)插入兩個(gè)相關(guān)聯(lián)的表中,可能會(huì)出現(xiàn)這樣的情況:第一個(gè)表中成功更新后,數(shù)據(jù)庫突然出現(xiàn)意外狀況,造成第二個(gè)表中的操作沒有完成,這樣,就會(huì)造成數(shù)據(jù)的不完整,甚至?xí)茐臄?shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么語句塊中每條語句都操作成功,要么都失敗。

5、鎖定表。

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

6、使用外鍵。

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

7、使用索引?

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

8、優(yōu)化的查詢語句?

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

MySQL性能優(yōu)化之索引設(shè)計(jì)

上一篇給小伙伴們講了關(guān)于SQL查詢性能優(yōu)化的相關(guān)技巧,一個(gè)好的查詢SQL離不開合理的索引設(shè)計(jì)。這篇小二就來嘮一嘮怎么合理的設(shè)計(jì)一個(gè)索引來優(yōu)化我們的查詢速度,要是有不合理的地方...嗯..

當(dāng)然啦,開個(gè)玩笑,歡迎小伙伴們指正!

通常情況下,字段類型的選擇是需要根據(jù)業(yè)務(wù)來判斷的,通常需要遵循以下幾點(diǎn)。

下列各種類型表格內(nèi)容來自菜鳥教程,權(quán)當(dāng)備忘。

優(yōu)化建議:

注意: INT(2)設(shè)置的為顯示寬度,而不是整數(shù)的長度,需要配合 ZEROFILL 使用 。

例如 id 設(shè)置為 TINYINT(2) UNSIGNED ,表示無符號(hào),可以存儲(chǔ)的最大數(shù)值為255,其中 TINYINT(2) 沒有配合 ZEROFILL 實(shí)際沒有任何意義,例如插入數(shù)字200,長度雖然超過了兩位,但是這個(gè)時(shí)候是可以插入成功的,查詢結(jié)果同樣為200;插入數(shù)字5時(shí),同樣查詢結(jié)果為5。

而 TINYINT(2) 配合 ZEROFILL 后,當(dāng)插入數(shù)字5時(shí),實(shí)際存儲(chǔ)的還是5,不過在查詢是MySQL會(huì)在前面補(bǔ)上一個(gè)0,即查詢出來的實(shí)際為 05 。

優(yōu)化建議:

優(yōu)化建議:

通常來說,考慮好表中每個(gè)字段應(yīng)該使用什么類型和長度,建完表需要做的事情不是馬上建立索引,而是先把相關(guān)主體業(yè)務(wù)開發(fā)完畢,然后把涉及該表的SQL都拿出來分析之后再建立索引。

盡量少建立單值索引( 唯一索引除外 ),應(yīng)當(dāng)設(shè)計(jì)一個(gè)或者兩三個(gè)聯(lián)合索引,讓每一個(gè)聯(lián)合索引都盡量去包含SQL語句中的 where、order by、group by 的字段,同時(shí)確保聯(lián)合索引的字段順序盡量滿足SQL查詢的最左前綴原則。

索引基數(shù)是指這個(gè)字段在表里總共有多少個(gè)不同的值,比如一張表總共100萬行記錄,其中有個(gè)性別字段,性別一共有三個(gè)值:男、女、保密,那么該字段的基數(shù)就是3。

如果對(duì)這種小基數(shù)字段建立索引的話,因?yàn)樗饕龢渲兄挥心?、女、保密三個(gè)值,根本沒法進(jìn)行快速的二分查找,同時(shí)還需要回表查詢,還不如全表掃描嘞。

一般建立索引,盡量使用那些基數(shù)比較大的字段,那么才能發(fā)揮出B+樹快速二分查找的優(yōu)勢(shì)來。

在 where 和 order by 出現(xiàn)索引設(shè)計(jì)沖突時(shí),是優(yōu)先針對(duì)where去設(shè)計(jì)索引?還是優(yōu)先針對(duì)order by設(shè)計(jì)索引?

通常情況下都是優(yōu)先針對(duì) where 來設(shè)計(jì)索引,因?yàn)橥ǔG闆r下都是先 where 條件使用索引快速篩選出來符合條件的數(shù)據(jù),然后對(duì)進(jìn)行篩選出來的數(shù)據(jù)進(jìn)行排序和分組,而 where 條件快速篩選出來的的數(shù)據(jù)往往不會(huì)很多。

對(duì)生產(chǎn)實(shí)際運(yùn)行過程中,或者測(cè)試環(huán)境大數(shù)據(jù)量測(cè)試過程中發(fā)現(xiàn)的慢查詢SQL進(jìn)行特定的索引優(yōu)化、代碼優(yōu)化等策略。

終于輪到實(shí)戰(zhàn)了,小二最喜歡實(shí)戰(zhàn)了。

寫到這里不得不吐槽一下,這個(gè)金三銀四的跳槽季節(jié),年前提離職了,結(jié)果離職還沒辦完就封村整整兩個(gè)禮拜了,嗚嗚嗚...

上節(jié)小二就提到會(huì)有個(gè)很有意思的小案例,那么在疫情當(dāng)下,門都出不去的日子,感覺這個(gè)例子更有意思了,咱們來討論一下各種社交平臺(tái)怎么做的用戶信息搜索呢。

社交平臺(tái)有一個(gè)小伙伴們都喜歡的功能,搜索好友信息,比如小二熟練的點(diǎn)開省份...城市..性別..年齡..身高...

咳咳咳...小二怎么可能干這種事情,小二的心里只有代碼,嗯...沒錯(cuò),就是這樣。

這個(gè)就可以說是對(duì)于用戶信息的查詢篩選了,通常這種表都是非常大數(shù)據(jù)量的,在不考慮分庫分表的情況下,怎么通過索引配合SQL來優(yōu)化呢?

通常我們?cè)诰帉慡QL是會(huì)寫出類似如下的SQL來執(zhí)行,有 where、order by、limit 等條件來查詢。

那么接下來小二一個(gè)一個(gè)慢慢增加字段來分析分析,怎么根據(jù)業(yè)務(wù)場(chǎng)景來設(shè)計(jì)索引。

針對(duì)這種情況,很簡單,設(shè)計(jì)一個(gè)聯(lián)合索引 (provice, city, sex) 就完事了。

那么這時(shí)候有小伙伴就會(huì)說了,很簡單啊,范圍字段放最后咱還是知道的,聯(lián)合索引改成 (provice, city, sex, age) 不就可以了。

嗯,是的,這么干沒毛病,但是小伙伴們有沒有想過有些人萬一既喜歡帥哥又喜歡美女,別想歪了哈...,挺多小姐姐就既喜歡帥哥又喜歡美女的。

那么這個(gè)時(shí)候小姐姐就不搜索性別了,那么這個(gè)時(shí)候聯(lián)合索引只能用到前兩個(gè)字段了,那么不符合咱們的專業(yè)標(biāo)準(zhǔn)啊,咋辦呢?這時(shí)候還是有辦法的,咱們只需要?jiǎng)觿?dòng)小腦袋改改SQL就行了,在沒有選擇性別時(shí)判斷一下,改成下面這樣就可以了。

咋辦嘞,同樣往聯(lián)合索引里面塞,例如 (provice, city, sex, hobby, xx, age) 。

針對(duì)這種多個(gè)范圍查詢的話,為了比較好的利用索引,在業(yè)務(wù)允許的情況下可以使用固定范圍,然后數(shù)據(jù)庫字段存儲(chǔ)范圍標(biāo)識(shí)就可以了,這樣就轉(zhuǎn)化為了等值匹配,就可以很好地利用索引了。

例如最后登錄時(shí)間字段不記錄最后登錄時(shí)間,而是記錄設(shè)置字段 is_login_within_seven_days 在7天內(nèi)有登錄則為1,否則為0,最后索引設(shè)計(jì)成 (provice, city, sex, hobby, xx, is_login_within_seven_days, age) 。

那么根據(jù)場(chǎng)景最后設(shè)計(jì)出來的這個(gè)索引可能已經(jīng)可以覆蓋大部分的查詢流量了,那么如果還有其他一部分熱度比較高的查詢?cè)趺崔k呢,辦法也很簡單啊,再加一兩個(gè)索引即可。

例如通常會(huì)查詢這個(gè)城市比較受歡迎(評(píng)分:score)的小姐姐,這時(shí)候添加一個(gè)聯(lián)合索引 (provice, city, sex, score) 那么就可以了。

可以看出,索引時(shí)必須結(jié)合場(chǎng)景來設(shè)計(jì)的,思路就是盡量用不超過3個(gè)復(fù)雜的聯(lián)合索引來抗住大部分的80%以上的常用查詢流量,然后再用一兩個(gè)二級(jí)索引來抗下一些非常用查詢流量。

以上就是小二要給大家分享的索引設(shè)計(jì),如果能動(dòng)動(dòng)你發(fā)財(cái)?shù)男∈纸o小二點(diǎn)個(gè)免費(fèi)的贊就更好啦~

下篇小二就來講講MySQL事務(wù)和鎖機(jī)制。

MySQL數(shù)據(jù)庫性能優(yōu)化之分區(qū)分表分庫

分表是分散數(shù)據(jù)庫壓力的好方法。

分表,最直白的意思,就是將一個(gè)表結(jié)構(gòu)分為多個(gè)表,然后,可以再同一個(gè)庫里,也可以放到不同的庫。

當(dāng)然,首先要知道什么情況下,才需要分表。個(gè)人覺得單表記錄條數(shù)達(dá)到百萬到千萬級(jí)別時(shí)就要使用分表了。

分表的分類

**1、縱向分表**

將本來可以在同一個(gè)表的內(nèi)容,人為劃分為多個(gè)表。(所謂的本來,是指按照關(guān)系型數(shù)據(jù)庫的第三范式要求,是應(yīng)該在同一個(gè)表的。)

分表理由:根據(jù)數(shù)據(jù)的活躍度進(jìn)行分離,(因?yàn)椴煌钴S的數(shù)據(jù),處理方式是不同的)

案例:

對(duì)于一個(gè)博客系統(tǒng),文章標(biāo)題,作者,分類,創(chuàng)建時(shí)間等,是變化頻率慢,查詢次數(shù)多,而且最好有很好的實(shí)時(shí)性的數(shù)據(jù),我們把它叫做冷數(shù)據(jù)。而博客的瀏覽量,回復(fù)數(shù)等,類似的統(tǒng)計(jì)信息,或者別的變化頻率比較高的數(shù)據(jù),我們把它叫做活躍數(shù)據(jù)。所以,在進(jìn)行數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)的時(shí)候,就應(yīng)該考慮分表,首先是縱向分表的處理。

這樣縱向分表后:

首先存儲(chǔ)引擎的使用不同,冷數(shù)據(jù)使用MyIsam 可以有更好的查詢數(shù)據(jù)?;钴S數(shù)據(jù),可以使用Innodb ,可以有更好的更新速度。

其次,對(duì)冷數(shù)據(jù)進(jìn)行更多的從庫配置,因?yàn)楦嗟牟僮鲿r(shí)查詢,這樣來加快查詢速度。對(duì)熱數(shù)據(jù),可以相對(duì)有更多的主庫的橫向分表處理。

其實(shí),對(duì)于一些特殊的活躍數(shù)據(jù),也可以考慮使用memcache ,redis之類的緩存,等累計(jì)到一定量再去更新數(shù)據(jù)庫。或者mongodb 一類的nosql 數(shù)據(jù)庫,這里只是舉例,就先不說這個(gè)。

**2、橫向分表**

字面意思,就可以看出來,是把大的表結(jié)構(gòu),橫向切割為同樣結(jié)構(gòu)的不同表,如,用戶信息表,user_1,user_2等。表結(jié)構(gòu)是完全一樣,但是,根據(jù)某些特定的規(guī)則來劃分的表,如根據(jù)用戶ID來取模劃分。

分表理由:根據(jù)數(shù)據(jù)量的規(guī)模來劃分,保證單表的容量不會(huì)太大,從而來保證單表的查詢等處理能力。

案例:同上面的例子,博客系統(tǒng)。當(dāng)博客的量達(dá)到很大時(shí)候,就應(yīng)該采取橫向分割來降低每個(gè)單表的壓力,來提升性能。例如博客的冷數(shù)據(jù)表,假如分為100個(gè)表,當(dāng)同時(shí)有100萬個(gè)用戶在瀏覽時(shí),如果是單表的話,會(huì)進(jìn)行100萬次請(qǐng)求,而現(xiàn)在分表后,就可能是每個(gè)表進(jìn)行1萬個(gè)數(shù)據(jù)的請(qǐng)求(因?yàn)椋豢赡芙^對(duì)的平均,只是假設(shè)),這樣壓力就降低了很多很多。

延伸:為什么要分表和分區(qū)?

日常開發(fā)中我們經(jīng)常會(huì)遇到大表的情況,所謂的大表是指存儲(chǔ)了百萬級(jí)乃至千萬級(jí)條記錄的表。這樣的表過于龐大,導(dǎo)致數(shù)據(jù)庫在查詢和插入的時(shí)候耗時(shí)太長,性能低下,如果涉及聯(lián)合查詢的情況,性能會(huì)更加糟糕。分表和表分區(qū)的目的就是減少數(shù)據(jù)庫的負(fù)擔(dān),提高數(shù)據(jù)庫的效率,通常點(diǎn)來講就是提高表的增刪改查效率。

什么是分表?

分表是將一個(gè)大表按照一定的規(guī)則分解成多張具有獨(dú)立存儲(chǔ)空間的實(shí)體表,我們可以稱為子表,每個(gè)表都對(duì)應(yīng)三個(gè)文件,MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。這些子表可以分布在同一塊磁盤上,也可以在不同的機(jī)器上。app讀寫的時(shí)候根據(jù)事先定義好的規(guī)則得到對(duì)應(yīng)的子表名,然后去操作它。

什么是分區(qū)?

分區(qū)和分表相似,都是按照規(guī)則分解表。不同在于分表將大表分解為若干個(gè)獨(dú)立的實(shí)體表,而分區(qū)是將數(shù)據(jù)分段劃分在多個(gè)位置存放,可以是同一塊磁盤也可以在不同的機(jī)器。分區(qū)后,表面上還是一張表,但數(shù)據(jù)散列到多個(gè)位置了。app讀寫的時(shí)候操作的還是大表名字,db自動(dòng)去組織分區(qū)的數(shù)據(jù)。

**MySQL分表和分區(qū)有什么聯(lián)系呢?**

1、都能提高mysql的性高,在高并發(fā)狀態(tài)下都有一個(gè)良好的表現(xiàn)。

2、分表和分區(qū)不矛盾,可以相互配合的,對(duì)于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式(如果merge這種分表方式,不能和分區(qū)配合的話,可以用其他的分表試),訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。

3、分表技術(shù)是比較麻煩的,需要手動(dòng)去創(chuàng)建子表,app服務(wù)端讀寫時(shí)候需要計(jì)算子表名。采用merge好一些,但也要?jiǎng)?chuàng)建子表和配置子表間的union關(guān)系。

4、表分區(qū)相對(duì)于分表,操作方便,不需要?jiǎng)?chuàng)建子表。

我們知道對(duì)于大型的互聯(lián)網(wǎng)應(yīng)用,數(shù)據(jù)庫單表的數(shù)據(jù)量可能達(dá)到千萬甚至上億級(jí)別,同時(shí)面臨這高并發(fā)的壓力。Master-Slave結(jié)構(gòu)只能對(duì)數(shù)據(jù)庫的讀能力進(jìn)行擴(kuò)展,寫操作還是集中在Master中,Master并不能無限制的掛接Slave庫,如果需要對(duì)數(shù)據(jù)庫的吞吐能力進(jìn)行進(jìn)一步的擴(kuò)展,可以考慮采用分庫分表的策略。

**1、分表**

在分表之前,首先要選中合適的分表策略(以哪個(gè)字典為分表字段,需要將數(shù)據(jù)分為多少張表),使數(shù)據(jù)能夠均衡的分布在多張表中,并且不影響正常的查詢。在企業(yè)級(jí)應(yīng)用中,往往使用org_id(組織主鍵)做為分表字段,在互聯(lián)網(wǎng)應(yīng)用中往往是userid。在確定分表策略后,當(dāng)數(shù)據(jù)進(jìn)行存儲(chǔ)及查詢時(shí),需要確定到哪張表里去查找數(shù)據(jù),

數(shù)據(jù)存放的數(shù)據(jù)表 = 分表字段的內(nèi)容 % 分表數(shù)量

**2、分庫**

分表能夠解決單表數(shù)據(jù)量過大帶來的查詢效率下降的問題,但是不能給數(shù)據(jù)庫的并發(fā)訪問帶來質(zhì)的提升,面對(duì)高并發(fā)的寫訪問,當(dāng)Master無法承擔(dān)高并發(fā)的寫入請(qǐng)求時(shí),不管如何擴(kuò)展Slave服務(wù)器,都沒有意義了。我們通過對(duì)數(shù)據(jù)庫進(jìn)行拆分,來提高數(shù)據(jù)庫的寫入能力,即所謂的分庫。分庫采用對(duì)關(guān)鍵字取模的方式,對(duì)數(shù)據(jù)庫進(jìn)行路由。

數(shù)據(jù)存放的數(shù)據(jù)庫=分庫字段的內(nèi)容%數(shù)據(jù)庫的數(shù)量

**3、即分表又分庫**

數(shù)據(jù)庫分表可以解決單表海量數(shù)據(jù)的查詢性能問題,分庫可以解決單臺(tái)數(shù)據(jù)庫的并發(fā)訪問壓力問題。

當(dāng)數(shù)據(jù)庫同時(shí)面臨海量數(shù)據(jù)存儲(chǔ)和高并發(fā)訪問的時(shí)候,需要同時(shí)采取分表和分庫策略。一般分表分庫策略如下:

中間變量 = 關(guān)鍵字%(數(shù)據(jù)庫數(shù)量*單庫數(shù)據(jù)表數(shù)量)

庫 = 取整(中間變量/單庫數(shù)據(jù)表數(shù)量)

表 = (中間變量%單庫數(shù)據(jù)表數(shù)量)

實(shí)例:

1、分庫分表

很明顯,一個(gè)主表(也就是很重要的表,例如用戶表)無限制的增長勢(shì)必嚴(yán)重影響性能,分庫與分表是一個(gè)很不錯(cuò)的解決途徑,也就是性能優(yōu)化途徑,現(xiàn)在的案例是我們有一個(gè)1000多萬條記錄的用戶表members,查詢起來非常之慢,同事的做法是將其散列到100個(gè)表中,分別從members0到members99,然后根據(jù)mid分發(fā)記錄到這些表中,牛逼的代碼大概是這樣子:

復(fù)制代碼 代碼如下:

?php

for($i=0;$i 100; $i++ ){

//echo "CREATE TABLE db2.members{$i} LIKE db1.members

";

echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}

";

}

?

2、不停機(jī)修改mysql表結(jié)構(gòu)

同樣還是members表,前期設(shè)計(jì)的表結(jié)構(gòu)不盡合理,隨著數(shù)據(jù)庫不斷運(yùn)行,其冗余數(shù)據(jù)也是增長巨大,同事使用了下面的方法來處理:

先創(chuàng)建一個(gè)臨時(shí)表:

/*創(chuàng)建臨時(shí)表*/

CREATE TABLE members_tmp LIKE members

然后修改members_tmp的表結(jié)構(gòu)為新結(jié)構(gòu),接著使用上面那個(gè)for循環(huán)來導(dǎo)出數(shù)據(jù),因?yàn)?000萬的數(shù)據(jù)一次性導(dǎo)出是不對(duì)的,mid是主鍵,一個(gè)區(qū)間一個(gè)區(qū)間的導(dǎo),基本是一次導(dǎo)出5萬條吧,這里略去了

接著重命名將新表替換上去:

/*這是個(gè)頗為經(jīng)典的語句哈*/

RENAME TABLE members TO members_bak,members_tmp TO members;

就是這樣,基本可以做到無損失,無需停機(jī)更新表結(jié)構(gòu),但實(shí)際上RENAME期間表是被鎖死的,所以選擇在線少的時(shí)候操作是一個(gè)技巧。經(jīng)過這個(gè)操作,使得原先8G多的表,一下子變成了2G多。

mysql 性能優(yōu)化參數(shù)配置

mysql -u root -p 回車輸入密碼進(jìn)入mysql

show processlist;

查看連接數(shù),可以發(fā)現(xiàn)有很多連接處于sleep狀態(tài),這些其實(shí)是暫時(shí)沒有用的,所以可以kill掉

show variables like "max_connections";

查看最大連接數(shù),應(yīng)該是與上面查詢到的連接數(shù)相同,才會(huì)出現(xiàn)too many connections的情況

set GLOBAL max_connections=1000;

修改最大連接數(shù),但是這不是一勞永逸的方法,應(yīng)該要讓它自動(dòng)殺死那些sleep的進(jìn)程。

show global variables like 'wait_timeout';

這個(gè)數(shù)值指的是mysql在關(guān)閉一個(gè)非交互的連接之前要等待的秒數(shù),默認(rèn)是28800s

set global wait_timeout=300;

修改這個(gè)數(shù)值,這里可以隨意,最好控制在幾分鐘內(nèi)

set global interactive_timeout=500;

修改這個(gè)數(shù)值,表示mysql在關(guān)閉一個(gè)連接之前要等待的秒數(shù),至此可以讓mysql自動(dòng)關(guān)閉那些沒用的連接,但要注意的是,正在使用的連接到了時(shí)間也會(huì)被關(guān)閉,因此這個(gè)時(shí)間值要合適

SHOW VARIABLES LIKE '%table_open_cache%';

查看

show global status like 'Open%tables';

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

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

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

2. 優(yōu)化

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

2.1 軟優(yōu)化

2.1.1 查詢語句優(yōu)化

1.首先我們可以用EXPLAIN或DESCRIBE(簡寫:DESC)命令分析一條查詢語句的執(zhí)行信息.

2.例:

顯示:

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

2.1.2 優(yōu)化子查詢

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

2.1.3 使用索引

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

2.1.4 分解表

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

2.1.5 中間表

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

2.1.6 增加冗余字段

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

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

2.2 硬優(yōu)化

2.2.1 硬件三件套

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

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

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

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

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

2.2.3 分庫分表

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

2.2.4 緩存集群

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

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

文章標(biāo)題:mysql怎么優(yōu)化性能,mysql的性能優(yōu)化方案有哪些
文章源于:http://jinyejixie.com/article28/dsdjgjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化定制網(wǎng)站、搜索引擎優(yōu)化網(wǎng)站改版ChatGPT、網(wǎng)站排名

廣告

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

網(wǎng)站托管運(yùn)營
射洪县| 大名县| 高阳县| 大冶市| 内丘县| 新泰市| 鹤壁市| 崇州市| 镇雄县| 高陵县| 屏东市| 伊金霍洛旗| 聂荣县| 潢川县| 扶余县| 潼南县| 大洼县| 凌云县| 苍南县| 雷波县| 乌拉特中旗| 西青区| 沂南县| 镇雄县| 阿图什市| 阳江市| 陇川县| 香河县| 庆云县| 大埔县| 揭阳市| 商洛市| 科技| 和硕县| 维西| 星座| 三原县| 南充市| 信阳市| 巴彦淖尔市| 栾川县|