溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL數(shù)據(jù)庫(kù)性能優(yōu)化的示例分析

發(fā)布時(shí)間:2021-12-27 10:09:22 來(lái)源:億速云 閱讀:174 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下MySQL數(shù)據(jù)庫(kù)性能優(yōu)化的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為什么做優(yōu)化??

因?yàn)閿?shù)據(jù)量太多了,項(xiàng)目部署上線再到用戶使用,每天數(shù)據(jù)增長(zhǎng)幾十萬(wàn)條,給服務(wù)器帶來(lái)非常大的負(fù)擔(dān),互聯(lián)網(wǎng)一直追求高性能,可是隨著業(yè)務(wù)規(guī)模變大,用戶數(shù)量變多,服務(wù)器的性能越來(lái)越差,因此我們不得不對(duì)數(shù)據(jù)庫(kù)有更高要求。

從哪些方面入手??

第一,是查詢的速度,我們期望數(shù)據(jù)量到達(dá)TB級(jí)別仍然能夠?qū)崿F(xiàn)百萬(wàn)級(jí)別查詢速度。

第二、是并發(fā)量,我們對(duì)它的要求能夠同時(shí)處理幾千甚至上萬(wàn)的并發(fā)訪問(wèn),還要配合Redis、MQ等。  

第三,高可用,隨著業(yè)務(wù)規(guī)模不斷變大,我們要隨時(shí)準(zhǔn)備對(duì)服務(wù)器進(jìn)行擴(kuò)展,可能由原來(lái)幾十臺(tái)服務(wù)器擴(kuò)展到上百臺(tái)甚至上千臺(tái)服務(wù)器,所以我們要搭載MySQL集群。

第四,事務(wù)的安全性,當(dāng)業(yè)務(wù)出現(xiàn)高并發(fā)訪問(wèn),怎么保證讀寫一致性???保證事務(wù)的安全性???  參考多線程的思路。。 

解決方案是什么???

第一個(gè)思考的是應(yīng)該用什么樣的存儲(chǔ)引擎,因?yàn)榇鎯?chǔ)引擎決定著它的性能,好比你是用汽車、飛機(jī)還是坦克, 每個(gè)引擎都有它特殊的作用。 業(yè)務(wù)上常用的是兩種,INNODB和MYISAM。

MySQL數(shù)據(jù)庫(kù)性能優(yōu)化的示例分析

 要怎樣選擇???

當(dāng)我們對(duì)業(yè)務(wù)沒(méi)有過(guò)多的讀寫要求,以查詢?yōu)橹?,使用MyISAM,當(dāng)我們對(duì)事務(wù)完整性要求較高,并發(fā)要求高,增刪頻繁,經(jīng)常進(jìn)行讀寫操作,使用INNODB更好。

第二個(gè)我們要給加快查詢速度, 所以要給表特殊字段添加索引,索引的原理是改變數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu),這里分為兩種:第一是BTree,第二是B+Tree。 我們業(yè)務(wù)上一般使用的是B+Tree,BTree有一個(gè)特點(diǎn),是根節(jié)點(diǎn)和葉子節(jié)點(diǎn)都會(huì)存放數(shù)據(jù),這會(huì)造成比如查詢最底層葉子節(jié)點(diǎn),會(huì)一層一層讀根節(jié)點(diǎn)的數(shù)據(jù),會(huì)增加磁盤I/O次數(shù),無(wú)形當(dāng)中又會(huì)增加數(shù)據(jù)庫(kù)的壓力。 所以要用B+Tree

第三實(shí)現(xiàn)高可用方案, 這里我們會(huì)為數(shù)據(jù)庫(kù)服務(wù)搭載主從結(jié)構(gòu)集群,緩解讀和寫的壓力 

第四是安全問(wèn)題,這里可以參考線程的安全問(wèn)題,比如怎么解決高并發(fā)訪問(wèn)??如何能保證事務(wù)的完整性??  像RocketMQ也涉及事務(wù)消息,  如何避免這類問(wèn)題, 我們可以上鎖。 以下是鎖的分類。

MySQL數(shù)據(jù)庫(kù)性能優(yōu)化的示例分析

SQL優(yōu)化

1、查詢盡量避免全表掃描,首先考慮在where、order by字段上添加索引

2、避免在where字段上使用NULL值,所以在設(shè)計(jì)表時(shí)盡量使用NOT NULL約束,有些數(shù)據(jù)會(huì)默認(rèn)為NULL,可以設(shè)置默認(rèn)值為0或者-1

3、避免在where子句中使用!=或<>操作符,Mysql只對(duì)<,<=,=,>,>=,BETWEEN,IN,以及某些時(shí)候的LIKE使用索引

4、避免在where中使用OR來(lái)連接條件,否則可能導(dǎo)致引擎放棄索引來(lái)執(zhí)行全表掃描,可以使用UNION進(jìn)行合并查詢

      select id from t where num = 30 union select id from t where num = 40;

5、盡量避免在where子句中進(jìn)行函數(shù)或者表達(dá)式操作

6、最好不要使用select * from t,用具體的字段列表代替"*",不要返回用不到的任何字段

7、in 和 not in 也要慎用,否則會(huì)導(dǎo)致全表掃描,如

select id from t where num IN(1,2,3)如果是連續(xù)的值建議使用between and,select id from t where between 1 and 3;

8、select id from t where col like %a%;模糊查詢左側(cè)有%會(huì)導(dǎo)致全表檢索,如果需要全文檢索可以使用全文搜索引擎比如es,slor

9、limit offset rows關(guān)于分頁(yè)查詢,盡量保證不要出現(xiàn)大的offset,比如limit 10000,10相當(dāng)于對(duì)已查詢出來(lái)的行數(shù)棄掉前10000行后再取10行,完全可以加一些條件過(guò)濾一下(完成篩選),而不應(yīng)該使用limit跳過(guò)已查詢到的數(shù)據(jù)。這是一個(gè)==offset做無(wú)用功==的問(wèn)題。對(duì)應(yīng)實(shí)際工程中,要避免出現(xiàn)大頁(yè)碼的情況,盡量引導(dǎo)用戶做條件過(guò)濾

以上是“MySQL數(shù)據(jù)庫(kù)性能優(yōu)化的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI