溫馨提示×

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

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

MySQL優(yōu)化的最基礎(chǔ)操作是什么

發(fā)布時(shí)間:2021-11-15 16:05:50 來源:億速云 閱讀:142 作者:iii 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹“MySQL優(yōu)化的最基礎(chǔ)操作是什么”,在日常操作中,相信很多人在MySQL優(yōu)化的最基礎(chǔ)操作是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL優(yōu)化的最基礎(chǔ)操作是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

                           

優(yōu)化思路

詳細(xì)的MySQL優(yōu)化步驟如下:

  • 檢查數(shù)據(jù)表結(jié)構(gòu),改善不完善設(shè)計(jì)

  • 跑一遍主要業(yè)務(wù),收集常用的數(shù)據(jù)庫查詢SQL

  • 分析查詢SQL,適當(dāng)拆分,添加索引等優(yōu)化查詢

  • 優(yōu)化SQL的同時(shí),優(yōu)化代碼邏輯

  • 添加本地緩存和redis緩存

盡可能不要使用NULL值

因?yàn)榻ū淼臅r(shí)候,如果不對(duì)創(chuàng)建的值設(shè)置默認(rèn)值,MySQL都會(huì)設(shè)置默認(rèn)為NULL。那么為啥用NULL不好呢?

  • NULL使得索引維護(hù)更加復(fù)雜,強(qiáng)烈建議對(duì)索引列設(shè)置NOT NULL

  • NOT IN、!=等負(fù)向條件查詢?cè)谟?code>NULL值的情況下返回永遠(yuǎn)為空結(jié)果,查詢?nèi)菀壮鲥e(cuò)

  • NULL列需要一個(gè)額外字節(jié)作為判斷是否為NULL的標(biāo)志位

  • 使用NULL時(shí)和該列其他的值可能不是同種類型,導(dǎo)致問題。(在不同的語言中表現(xiàn)不一樣)

  • MySQL難以優(yōu)化對(duì)可為NULL的列的查詢

所以對(duì)于那些以前偷懶的字段,手動(dòng)設(shè)置一個(gè)默認(rèn)值吧,空字符串呀,0呀補(bǔ)上。

雖然這種方法對(duì)于MySQL的性能來說沒有提升多少,但是這是一個(gè)好習(xí)慣,而且以小見大,不要忽略這些細(xì)節(jié)。

添加索引

對(duì)于經(jīng)常查詢的字段,請(qǐng)加上索引,有索引和沒有索引的查詢速度相差十倍甚至更多。

  • 一般來說,每張表都需要有一個(gè)主鍵id字段

  • 常用于查詢的字段應(yīng)該設(shè)置索引

  • varchar類型的字段,在建立索引的時(shí)候,最好指定長(zhǎng)度

  • 查詢有多個(gè)條件時(shí),優(yōu)先使用具有索引的條件

  • LIKE條件這樣的模糊搜索對(duì)于字段索引是無效的,需要另外建立關(guān)鍵詞索引來解決

  • 請(qǐng)盡量不要在數(shù)據(jù)庫層面約束表和表之間的關(guān)系,這些表之間的依賴應(yīng)該在代碼層面去解決

當(dāng)表和表之間有約束時(shí),雖然增刪查的SQL語句變簡(jiǎn)單了,但是帶來的負(fù)面效果是插入等操作數(shù)據(jù)庫都會(huì)去檢查約束(雖然可以手動(dòng)設(shè)置忽略約束),這樣相當(dāng)于把一些業(yè)務(wù)邏輯寫到了數(shù)據(jù)庫層,不便于維護(hù)。

優(yōu)化表字段結(jié)構(gòu)

數(shù)據(jù)庫中那些可以用整形表示的數(shù)據(jù)就不要使用字符串類型,到底是用varchar還是char要看字段的可能值。

這種優(yōu)化往往在數(shù)據(jù)庫中有大量數(shù)據(jù)以后是不可行的,最好在數(shù)據(jù)庫設(shè)計(jì)之前就設(shè)計(jì)好。

  • 對(duì)于那些可能值很有限的列,使用tinyint代替VARCHAR,

    • 比如記錄移動(dòng)設(shè)備平臺(tái),只有兩個(gè)值:android,ios,那么就可以使用0表示android,1表示ios,這種列一定要寫好注釋

    • 為什么不用ENUM呢?ENUM擴(kuò)展困難,比如后來移動(dòng)平臺(tái)又增加了一個(gè)ipad,那豈不是懵逼了,而tinyint加個(gè)2就行,而且ENUM在代碼里面處理起來特別奇怪,是當(dāng)成整形呢還是字符串,各個(gè)語言不一樣。

    • 這種方式,一定要在數(shù)據(jù)庫注釋或者代碼里面寫明各個(gè)值的含義

  • 對(duì)于那些定長(zhǎng)字符串,可以使用char,比如郵編,總是5位

  • 對(duì)于那些長(zhǎng)度未知的字符串,使用varchar

  • 不要濫用bigint,比如記錄文章數(shù)目的表id字段,用int就行了,21億篇文章上限夠了

  • 適當(dāng)打破數(shù)據(jù)庫范式添加冗余字段,避免查詢時(shí)的表連接

查詢的時(shí)候,肯定int類型比varchar快,因?yàn)檎麛?shù)的比較直接調(diào)用底層運(yùn)算器就可以實(shí)現(xiàn),而字符串比較要逐個(gè)字符比較。

定長(zhǎng)數(shù)據(jù)比變長(zhǎng)數(shù)據(jù)查詢快,因?yàn)楸容^定長(zhǎng)數(shù)據(jù)與數(shù)據(jù)之間的偏移是固定的,很容易計(jì)算下一個(gè)數(shù)據(jù)的偏移。而變長(zhǎng)數(shù)據(jù)則還需要多一步去查詢下一個(gè)數(shù)據(jù)的偏移量。不過。定長(zhǎng)數(shù)據(jù)可能會(huì)浪費(fèi)更多的存儲(chǔ)空間。

大表拆分

對(duì)于那些數(shù)據(jù)量可能近期會(huì)超過500W或者增長(zhǎng)很快的表,一定要提前做好垂直分表或者水平分表,當(dāng)數(shù)據(jù)量超過百萬以后,查詢速度會(huì)明顯下降。

分庫分表盡量在數(shù)據(jù)庫設(shè)計(jì)初期敲定方案,否則后期會(huì)極大增加代碼復(fù)雜性而且不易更改。

垂直分表是按照日期等外部變量進(jìn)行分表,水平分表是按照表中的某些字段關(guān)系,使用hash映射等分表。

分庫分表的前提條件是在執(zhí)行查詢語句之前,已經(jīng)知道需要查詢的數(shù)據(jù)可能會(huì)落在哪一個(gè)分庫和哪一個(gè)分表中。

優(yōu)化查詢語句

這個(gè)才是很多系統(tǒng)數(shù)據(jù)庫瓶頸的始作俑者。

  • 請(qǐng)盡量使用簡(jiǎn)單的查詢,避免使用表鏈接

  • 請(qǐng)盡量避免全表掃描,會(huì)造成全表掃描的語句包括但不限于:

    • where子句條件恒真或?yàn)榭?/p>

    • 使用LIKE

    • 使用不等操作符(<>、!=)

    • 查詢含有is null的列

    • 在非索引列上使用or

  • 多條件查詢時(shí),請(qǐng)把簡(jiǎn)單查詢條件或者索引列查詢置于前面

  • 請(qǐng)盡量指定需要查詢的列,不要偷懶使用select *

    • 如果不指定,一方面會(huì)返回多余的數(shù)據(jù),占用帶寬等

    • 另一方面MySQL執(zhí)行查詢的時(shí)候,沒有字段時(shí)會(huì)先去查詢表結(jié)構(gòu)有哪些字段

  • 大寫的查詢關(guān)鍵字比小寫快一點(diǎn)點(diǎn)

  • 使用子查詢會(huì)創(chuàng)建臨時(shí)表,會(huì)比鏈接(JOIN)和聯(lián)合(UNION)稍慢

  • 在索引字段上查詢盡量不要使用數(shù)據(jù)庫函數(shù),不便于緩存查詢結(jié)果

  • 當(dāng)只要一行數(shù)據(jù)時(shí),請(qǐng)使用LIMIT 1,如果數(shù)據(jù)過多,請(qǐng)適當(dāng)設(shè)定LIMIT,分頁查詢

  • 千萬不要 ORDER BY RAND(),性能極低

添加緩存

使用redis等緩存,還有本地文件緩存等,可以極大地減少數(shù)據(jù)庫查詢次數(shù)。緩存這個(gè)東西,一定要分析自己系統(tǒng)的數(shù)據(jù)特點(diǎn),適當(dāng)選擇。

  • 對(duì)于一些常用的數(shù)據(jù),比如配置信息等,可以放在緩存中

  • 可以在本地緩存數(shù)據(jù)庫的表結(jié)構(gòu)

  • 緩存的數(shù)據(jù)一定要注意及時(shí)更新,還有設(shè)置有效期

  • 增加緩存務(wù)必會(huì)增加系統(tǒng)復(fù)雜性,一定要注意權(quán)衡

到此,關(guān)于“MySQL優(yōu)化的最基礎(chǔ)操作是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(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