瞬间带你了解如何优化 Mysql 数据库,老板再也不担心客户投诉了
Mysql優(yōu)化(通用版)
- 一、優(yōu)化方向
- 二、優(yōu)化方法
- 1、監(jiān)控分析
- 2、改變 SQL 執(zhí)行計(jì)劃
- 三、軟優(yōu)化
- 1、查詢語(yǔ)句優(yōu)化
- 2、優(yōu)化子查詢
- 3、使用索引
- 4、分解表
- 5、增加中間表
- 6、增加冗余字段
- 7、選擇合適的引擎
- 8、分析表、檢查表、優(yōu)化表
- 9、視圖的使用
- 四、硬優(yōu)化
- 1、CPU、內(nèi)存、磁盤
- 2、參數(shù)(提高資源利用率——》提高M(jìn)ySQL服務(wù)器性能)
- 3、分庫(kù)分表
- 五、架構(gòu)優(yōu)化
- 1、主從復(fù)制
- ①、異步復(fù)制
- ②、全同步復(fù)制
- ③、半同步復(fù)制
- 2、讀寫分離
- 3、MHA高可用
- 4、proxySQL代理
一、優(yōu)化方向
二、優(yōu)化方法
1、監(jiān)控分析
- 硬件資源監(jiān)控
- 關(guān)注的主要數(shù)據(jù)庫(kù)服務(wù)器在IO和CPU方面的指標(biāo)。
- mysql性能分析器
- 可以利用 mysql profiling(mysql性能分析器)來(lái)優(yōu)化sql語(yǔ)句,即查看SQL執(zhí)行消耗系統(tǒng)資源的信息(需要開(kāi)啟才能應(yīng)用該功能)。
- 慢查詢分析
- 通過(guò)慢日志查詢可以知道哪些SQL語(yǔ)句執(zhí)行效率低下,那些sql語(yǔ)句使用的頻率高等。
對(duì)MySQL查詢語(yǔ)句的監(jiān)控、分析、優(yōu)化是MySQL優(yōu)化非常重要的一步。開(kāi)啟慢查詢?nèi)罩竞?#xff0c;由于日志記錄操作,在一定程度上會(huì)占用CPU資源影響mysql的性能,但是可以階段性開(kāi)啟來(lái)定位性能瓶頸。
2、改變 SQL 執(zhí)行計(jì)劃
使用explain命令查看query語(yǔ)句的性能
- id:id主要是用來(lái)標(biāo)識(shí)sql執(zhí)行順序,如果沒(méi)有子查詢,一般來(lái)說(shuō)id只有1個(gè),執(zhí)行順序也是從上到下。
- select_type:每個(gè)select子句的類型,主要分成下面幾種:
- SIMPLE:查詢中不包含任何子查詢或者union
- PRIMARY:查詢中包含了任何復(fù)雜的子部分,最外層的就會(huì)變成PRIMARY
- SUBQUERY:在SELECT或者WHERE列表中包含了子查詢
- DERIVED:在FROM中包含了子查詢
- UNION:如果第二個(gè)SELECT出現(xiàn)在UNION之后,則被標(biāo)記為UNION,如果UNION包含在FROM子句的子查詢中,外層SELECT會(huì)被標(biāo)記為:DERIVED
- UNION RESULT從UNION表獲取結(jié)果的select
- type:是指MySQL在表中找到所需行的方式,也就是訪問(wèn)行的“類型”,從 all 開(kāi)始,效率逐漸上升:
- all:全表掃描,效率最低
- index:index會(huì)根據(jù)索引樹(shù)遍歷
- range:索引范圍掃描,返回匹配值域的行。
- ref:非唯一性索引掃描,返回匹配某個(gè)單獨(dú)值的所有行。一般是指多列的唯一索引中的某一列。
- eq_ref:唯一性索引掃描,表中只有一條記錄與之匹配。
- const、system:主要針對(duì)查詢中有常量的情況,如果結(jié)果只有一行會(huì)變成system
- NULL:顯而易見(jiàn),既不走表,也不走索引
- possible_keys
- possible_keys列預(yù)估了mysql能夠?yàn)楫?dāng)前查詢選擇的索引,這個(gè)字段是完全獨(dú)立于執(zhí)行計(jì)劃中輸出的表的順序,意味著在實(shí)際查詢中可能用不到這些索引。
- 如果該字段為空則意味著沒(méi)有可使用的索引,這個(gè)時(shí)候你可以考慮為where后面的字段建立索引。
- key
- 這個(gè)字段表示了mysql真實(shí)使用的索引(如果為NULL,則沒(méi)有使用索引)。如果mysql優(yōu)化過(guò)程中沒(méi)有加索引,可以強(qiáng)制加hint使用索引。
- key_len
- 索引長(zhǎng)度字段顧名思義,表示了mysql查詢中使用的索引的長(zhǎng)度(最大可能長(zhǎng)度),并非實(shí)際使用長(zhǎng)度,理論上長(zhǎng)度越短越好。key_len是根據(jù)表定義計(jì)算而得的,不是通過(guò)表內(nèi)檢索出的。
- ref
- 這個(gè)字段一般是指一些常量用于選擇過(guò)濾(顯示索引的那一列被使用了,如果可能,是一個(gè)常量const)。
- rows
- 預(yù)估結(jié)果集的條數(shù),可能不一定完全準(zhǔn)確(根據(jù)表統(tǒng)計(jì)信息及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數(shù))。
- Extra
- 不適合在其他字段中顯示,但是十分重要的額外信息:
- Using filesort:mysql對(duì)數(shù)據(jù)使用一個(gè)外部的索引排序,而不是按照表內(nèi)的索引進(jìn)行排序讀取。也就是說(shuō)mysql無(wú)法利用索引完成的排序操作成為“文件排序”。
- Using temporary:使用臨時(shí)表保存中間結(jié)果,也就是說(shuō)mysql在對(duì)查詢結(jié)果排序時(shí)使用了臨時(shí)表,常見(jiàn)于order by 和 group by。
- Using index:表示相應(yīng)的 select 操作中使用了覆蓋索引(Covering Index),避免了訪問(wèn)表的數(shù)據(jù)行,這樣提高了效率(不使用select *);如果同時(shí)出現(xiàn)Using where,表明索引被用來(lái)執(zhí)行索引鍵值的查找;如果沒(méi)用同時(shí)出現(xiàn)Using where,表明索引用來(lái)讀取數(shù)據(jù)而非執(zhí)行查找動(dòng)作。
- Using join buffer:使用了鏈接緩存。
- eq_ref:唯一性索引掃描,表中只有一條記錄與之匹配。
- Impossible WHERE:where子句的值總是false,不能用來(lái)獲取任何元祖。
- select tables optimized away:在沒(méi)有g(shù)roup by子句的情況下,基于索引優(yōu)化MIN/MAX操作或者對(duì)于MyISAM存儲(chǔ)引擎優(yōu)化COUNT(*)操作,不必等到執(zhí)行階段在進(jìn)行計(jì)算,查詢執(zhí)行計(jì)劃生成的階段即可完成優(yōu)化。
- distinct:優(yōu)化distinct操作,在找到第一個(gè)匹配的元祖后即停止找同樣值得動(dòng)作。
- 不適合在其他字段中顯示,但是十分重要的額外信息:
三、軟優(yōu)化
1、查詢語(yǔ)句優(yōu)化
- EXPLAIN或DESCRIBE(簡(jiǎn)寫:DESC)命令分析一條查詢語(yǔ)句的執(zhí)行信息,查看其中的不足,予以改善
2、優(yōu)化子查詢
- 在MySQL中,盡量使用JOIN來(lái)代替子查詢,因?yàn)樽硬樵冃枰短撞樵?#xff0c;嵌套查詢時(shí)會(huì)建立一張臨時(shí)表,臨時(shí)表的建立和刪除都會(huì)有較大的系統(tǒng)開(kāi)銷,而連接查詢不會(huì)創(chuàng)建臨時(shí)表,因此效率比嵌套子查詢高。
3、使用索引
- 根據(jù)情況,創(chuàng)建合適的索引
- 主鍵、唯一鍵會(huì)自動(dòng)創(chuàng)建索引
- 外鍵也必須有索引,因?yàn)橥怄I是子表的主鍵關(guān)連建,能更快速的定位子表內(nèi)容
- 使用唯一性較好的、更新不是很頻繁的、經(jīng)常與其他表進(jìn)行連接的字段作為索引
- 經(jīng)常出現(xiàn)在 where 語(yǔ)句中的字段,需要做索引,會(huì)更好的方便我們處理日常事務(wù),節(jié)約時(shí)間成本
- 選擇性較高的字段需要做索引
- 超長(zhǎng)字段,建議做全文索引,或者不建立索引
4、分解表
- 對(duì)于字段較多的表,如果某些字段使用頻率較低,此時(shí)應(yīng)當(dāng),將其分離出來(lái)從而形成新的表。
- 大表拆分成多個(gè)小表,之間進(jìn)行外鍵關(guān)聯(lián),提高查詢效率。
5、增加中間表
- 對(duì)于將大量連接查詢的表可以創(chuàng)建中間表,從而減少在查詢時(shí)造成的連接耗時(shí)。
6、增加冗余字段
- 類似于創(chuàng)建中間表,增加冗余也是為了減少連接查詢。
7、選擇合適的引擎
- 根據(jù)不同的使用場(chǎng)景,分配不同的數(shù)據(jù)庫(kù)引擎,提高效率。
8、分析表、檢查表、優(yōu)化表
- 分析表主要是分析表中關(guān)鍵字的分布,檢查表主要是檢查表中是否存在錯(cuò)誤,優(yōu)化表主要是消除刪除或更新造成的表空間浪費(fèi)。
9、視圖的使用
- 把表的一個(gè)子集進(jìn)行排序并創(chuàng)建視圖,有時(shí)能加速查詢(特別是要被多次執(zhí)行的查詢)。它有助于避免多重排序操作,而且在其他方面還能簡(jiǎn)化優(yōu)化器的工作。視圖中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤I/O,所以查詢工作量可以得到大幅減少。
四、硬優(yōu)化
1、CPU、內(nèi)存、磁盤
- 配置多核心和頻率高的cpu,多核心可以執(zhí)行多個(gè)線程.
- 配置大內(nèi)存,提高內(nèi)存,即可提高緩存區(qū)容量,因此能減少磁盤I/O時(shí)間,從而提高響應(yīng)速度.
- 配置高速磁盤或合理分布磁盤:高速磁盤提高I/O,分布磁盤能提高并行操作的能力.
2、參數(shù)(提高資源利用率——》提高M(jìn)ySQL服務(wù)器性能)
- key_buffer_size:索引緩沖區(qū)大小
- table_cache:能同時(shí)打開(kāi)表的個(gè)數(shù)
- query_cache_size和query_cache_type:前者是查詢緩沖區(qū)大小,后者是前面參數(shù)的開(kāi)關(guān),0表示不使用緩沖區(qū),1表示使用緩沖區(qū),但可以在查詢中使用SQL_NO_CACHE表示不要使用緩沖區(qū),2表示在查詢中明確指出使用緩沖區(qū)才用緩沖區(qū),即SQL_CACHE
- sort_buffer_size:排序緩沖區(qū)
3、分庫(kù)分表
- 當(dāng)遇到高并發(fā)環(huán)境時(shí),數(shù)據(jù)庫(kù)壓力可能過(guò)大,系統(tǒng)性能可能會(huì)降低,因?yàn)閿?shù)據(jù)庫(kù)負(fù)載過(guò)高對(duì)性能會(huì)有影響,可能導(dǎo)致數(shù)據(jù)庫(kù)宕機(jī)
- 為防止宕機(jī)情況發(fā)生,可以把一個(gè)庫(kù)拆分為多個(gè)庫(kù),部署在多個(gè)數(shù)據(jù)庫(kù)服務(wù)上,這時(shí)作為主庫(kù)承載寫入請(qǐng)求。然后每個(gè)主庫(kù)都掛載至少一個(gè)從庫(kù),由從庫(kù)來(lái)承載讀請(qǐng)求。
五、架構(gòu)優(yōu)化
1、主從復(fù)制
主從復(fù)制簡(jiǎn)單地說(shuō),就是主服務(wù)器通過(guò)dump線程把數(shù)據(jù)寫入二進(jìn)制日志,然后從服務(wù)器通過(guò)IO線程的請(qǐng)求,把二進(jìn)制日志同步到自身的中繼日志中,接著通過(guò)SQL線程,把SQL語(yǔ)句在自己的庫(kù)執(zhí)行一遍,以達(dá)到數(shù)據(jù)同步的目的。
①、異步復(fù)制
默認(rèn)復(fù)制為異步復(fù)制,主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后立即返回客戶端,并不需要等待從服務(wù)器是否同步完成,這樣就有一個(gè)時(shí)間差,這時(shí)候如果出現(xiàn)了主服務(wù)器出現(xiàn)災(zāi)難性問(wèn)題,可能會(huì)導(dǎo)致從服務(wù)器數(shù)據(jù)沒(méi)有完全同步完成,造成數(shù)據(jù)的丟失
②、全同步復(fù)制
當(dāng)主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后,會(huì)等待所有從服務(wù)器也執(zhí)行完該事務(wù)后,才能返回客戶端,所以全同步復(fù)制的性能必然會(huì)受到嚴(yán)重的影響。
③、半同步復(fù)制
介于異步和全同步之間,主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后,會(huì)等待至少一個(gè)從庫(kù)接收并寫入中繼日志后才會(huì)返回客戶端。
相對(duì)于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,但也相對(duì)的造成了一定程度的延遲
2、讀寫分離
讀寫分離簡(jiǎn)單的說(shuō)是把對(duì)數(shù)據(jù)庫(kù)讀和寫的操作分開(kāi)對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)服務(wù)器,這樣能有效地減輕數(shù)據(jù)庫(kù)壓力,也能減輕IO壓力。主數(shù)據(jù)庫(kù)提供寫操作,從數(shù)據(jù)庫(kù)提供讀操作,其實(shí)在很多系統(tǒng)中,主要是讀的操作。當(dāng)主數(shù)據(jù)庫(kù)進(jìn)行寫操作時(shí),數(shù)據(jù)要同步到從的數(shù)據(jù)庫(kù),這樣才能有效保證數(shù)據(jù)庫(kù)完整性
3、MHA高可用
MHA(MasterHigh Availability)是一套優(yōu)秀的MySQL高可用環(huán)境下故障切換和主從復(fù)制的軟件。當(dāng)主服務(wù)器出現(xiàn)故障時(shí),MHA能做到0-30秒內(nèi)自動(dòng)完成故障切換操作,讓VIP漂移到備選的服務(wù)器上,以保證服務(wù)的不中斷運(yùn)行,給我們爭(zhēng)取了搶修主服務(wù)器的時(shí)間。
4、proxySQL代理
- proxySQL代理功能:
- 最基本的讀/寫分離,且方式有多種
- 可定制基于用戶、基于schema、基于語(yǔ)句的規(guī)則對(duì)SQL語(yǔ)句進(jìn)行路由。換句話說(shuō),規(guī)則很靈活?;趕chema和與語(yǔ)句級(jí)的規(guī)則,可以實(shí)現(xiàn)簡(jiǎn)單的sharding(分庫(kù)分表)
- 可緩存查詢結(jié)果。雖然ProxySQL的緩存策略比較簡(jiǎn)陋,但實(shí)現(xiàn)了基本的緩存功能,絕大多數(shù)時(shí)候也夠用了。
- 監(jiān)控后端節(jié)點(diǎn)。ProxySQL可以監(jiān)控后端節(jié)點(diǎn)的多個(gè)指標(biāo),包括:ProxySQL和后端的心跳信息,后端節(jié)點(diǎn)的read-only/read-write,slave和master的數(shù)據(jù)同步延遲性(replication lag)
總結(jié)
以上是生活随笔為你收集整理的瞬间带你了解如何优化 Mysql 数据库,老板再也不担心客户投诉了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 金士顿DDR2内存真伪鉴别:外包装与产品
- 下一篇: 三星evo pr0内存卡:速度猛如虎,可