您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL優(yōu)化的最基礎(chǔ)操作是什么”,在日常操作中,相信很多人在MySQL優(yōu)化的最基礎(chǔ)操作是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL優(yōu)化的最基礎(chǔ)操作是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
詳細(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緩存
因?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ù)。
數(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è)分表中。
這個(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í)用的文章!
免責(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)容。