互聯網寒冬!技術站最全MySQL數據庫實戰規范

享學課堂特邀作者:老顧

轉載請聲明出處!

前言

我們小伙伴們經常使用到mysql數據庫,一般就這么一用,很少會考慮mysql里面的細節問題,如sql語句的規范,或索引有沒有起到相應的效果,今天老顧就給大家介紹一下mysql實戰。

命名規范

1、所有數據庫對象都要小寫字母、并用下劃線分割
2、所有數據庫對象*不要用mysql關鍵字命名
3、庫表的命名要達到看到此名稱,就大概知道是干嘛的
4、臨時庫表要以tmp_為前綴,日期為后綴
5、備份庫表要以bak_為前綴,日期為后綴
6、相同的數據,在所有表中的列名和類型要一致

基礎設計規范

1、在新建表時,要使用InnoDB引擎

因為InnoDB支持事務、行鎖、性能更好。

2、新庫使用utf8mb4字符集

兼容更好,可以避免產生亂碼,防止索引創建失敗。

3、表和字段必須加入中文注釋

方便以后的系統維護。

4、禁止使用存儲過程、視圖、觸發器、Event

能夠不占用數據庫的資源,就不要占用;讓這些計算上移到服務層。將來的進行數據拆分方便,存儲過程等是針對單實例的,無法適用分庫分表的架構。

5、單表數據量,控制在500萬以內

當然mysql可以存儲1000萬數據,但過大后會影響mysql 的性能以及維護工作。想要存儲更多的數據,可以對數據進行拆分,分庫分表設計來控制單表數據量。

6、謹慎利用Mysql分區功能

在分區表中物理上面是多個文件,但邏輯上是一個文件,靈活度不夠,而且跨分區查詢效率低;還是建議使用物理分區,市面上也有一些中間件mycat、sharding-jdbc等。

7、減少表的寬度、冷熱數據分離、必須有主鍵

a、mysql表的列數限制可以為4096列,每一行的數據大小不能超過65535字節;寬度越大,加載在內存中占用內存就越大,IO消耗越大。表的寬度建議在30左右。

b、要把經常用的數據列放在一起,這樣可以一次性讀取出來;把經常用不到的數據分離出去,這樣極大提高效率 。

c、主鍵的好處,就是更好的利用索引,提高查詢效率。不明白原理,可以看老顧之前的文章。

8、禁止使用外鍵,交給程序控制

這個是不是和我們理解的不一樣,為什么不要外鍵?外鍵會導致表與表之間耦合,這樣更新操作都會涉及到相關聯的表,十分影響sql的性能,且容易造成死鎖。

9、禁止使用預留字段

很多小伙伴為了以后的業務擴展,都喜歡在表中建立類似DEMO1、DEMO2字段,列名沒有任何業務含義,而且類型都是用String代替。預留字段另一個好處就是業務改變后,利用預留字段,SQL語句不需要改變,其實這個問題用一些ORM工具就能夠很好的解決。

字段設計規范

1、優先選擇符合業務的最小存儲類型

可以有效節省數據庫的空間,查詢的時候也能夠減少IO消耗。

2、字段定義為Not Null,且提供默認值

null值的列,很難對索引優化;null的列對占用更多的空間,因為需要額外的空間來標識。null的查詢操作,也過于麻煩,只能采用is null或is not null,而不能采用=、in、<、<>、not in 、!=操作符,如:where name!=‘laogu’,是不會查詢出name為null的值的。

3、禁止使用Text、BLOB類型

Mysql內存臨時表不支持Text、Blob類型,如果查詢中包含這些類型,就不能使用內存臨時表,而會采用磁盤臨時表,導致性能很差會浪費更多的磁盤和內存空間,導致數據庫內存命中率低,影響數據庫性能
如果一定要使用,建立單獨的擴展表。

4、禁止使用ENUM、可用Tinyint代替

修改Enum值時,需要使用alter語句 order by操作效率低。

5、禁止使用小數

直接使用整數,小數容易有精度差異,導致金額對不上。

6、使用Timestamp或Datetime類型存儲時間

經常小伙伴們用String類型儲存時間缺點

1:無法用日期函數進行計算比較缺點

2:用戶字符串存儲,占用更多的空間。

索引設計規范

1、每張表索引不要超過5個一般常識索引可以增加查詢效率,但同樣降低了插入和更新的效率。

但針對查詢,索引也不是越多越好。因為mysql優化器在選擇如何優化查詢時,會根據查詢信息,對每一個用到的索引進行評估,以生成一個最好的執行計劃,如果有很多個索引,就會增加mysql優化器的執行時間,反而降低了查詢性能。

2、區分度不高、更新頻繁的列 不建議加索引

更新頻繁會變更B+樹,大大降低數據庫的性能。區分度(區分度=列中不同值的數量/列的總行數),區分度不高(如:性別,只有男、女、未知)建立索引沒有意義,性能和全表掃描差不多。

3、聯合索引時,把區分度高的放到最左側因為mysql的索引結構原理,聯合索引有一個原則,就是最左索引原則。

a、盡量把區分度高的放在聯合索引的最左側

b、把查詢頻繁的列放在最左側

c、把字段長度小的放到最左側,這樣內存頁存儲數據量越大,IO性能越好。

SQL開發規范

1、禁止使用select 要用select 列名 代替 select

原因:1、消耗更多的CPU、IO開銷

2、無法使用覆蓋索引

3、可減少表結構的改動,帶來的代碼影響。

2、禁止使用屬性隱式轉換

隱式轉換會導致索引失效,如:select name from customer where id=‘1000’;id為整型,正確的寫法select name from customer where id=1000。

3、建議使用預編譯語句進行數據庫操作

預編譯語句可以重復使用優化計劃,減少SQL編譯時間,避免SQL注入。

4、禁止使用不含字段的insert語句

如:insert into txxxx values(xxx,xxx,xxx) 應使用insert into txxx(c1,c2,c3) values(xxx,xxx,xxxx)防止表結構變化。

5、禁止負向查詢,以及%開頭的模糊查詢

負向查詢為:not、!=、<>、not in、not like等,會導致全表掃描 %開頭也會導致全表掃描。

6、一個SQL只能利用復合索引中的一列進行范圍查詢

如:有c1、c2、c3三個列建立聯合索引,在查詢條件中有c1列的范圍查詢,則在c2、c3列上的索引將不會被用到。如果一定要用c1做范圍查詢,那把c1列放到聯合索引的最右側。

7、禁止在where條件上對屬性使用函數或表達式

如:select id from torder where fromunixtime(createtime) >= ‘20190101’
應改為
select id from torder where createtime >= unixtimestamp(‘20190720’)

8、禁止大表使用join查詢,禁止大表使用子查詢

會產生臨時表,消耗較多的內存、cpu資源,影響性能。

9、避免使用JOIN關聯太多的表

對于Mysql來說,是有關聯緩存的,緩存的大小是由joinbuffersize參數進行設置。對于同一個SQL多關聯一個表,就會多分配一個關聯緩存,越多的join,就消耗越多的內存。如果joinbuffersize設置不合理,就會導致數據庫內存溢出,影響性能和穩定性。

10、禁止使用OR條件,必須改為IN查詢

絕大多數情況下,Mysql的OR查詢是不能命中索引的。

11、盡量減少與數據庫的交互次數

能夠一次性讀取盡可能多的數據,減少和數據庫的交互,可以極大提升數據庫的吞吐量。

12、禁止使用order by rand()進行排序

會把表中的所有數據都加到內存中,然后在對內存的數據進行隨機排序,會消耗較多的CPU、IO以及內存資源
推薦在程序中生成一個隨機值,傳給數據庫的方式。

總結

上面有很多規范,也許小伙伴一時間記不住,慢慢練習就會越熟練。老顧這里給大家分享一個索引口訣,方便記憶。

索引優化口訣
全值匹配我最愛,最左前綴要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,范圍之后全失效;
Like百分寫最右,覆蓋索引不寫星;
不等空值還有or,索引失效要少用;
VAR引號不可丟,SQL高級也不難!

以上MySQL數據庫實戰規范你都了解了嗎?記住了嗎?記不住還不快點個收藏點個贊→_←

最后

如果覺得本文對你有幫助的話,不妨給我點個贊,關注一下吧!

資料免費領取方式:點擊這里

你都了解了嗎?記住了嗎?記不住還不快點個收藏點個贊→_←

最后

如果覺得本文對你有幫助的話,不妨給我點個贊,關注一下吧!

資料免費領取方式:點擊這里

[外鏈圖片轉存中…(img-pL6g0uFV-1623730871297)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL求一個表中非重復數據及其出現的次數

mysql中&#xff0c;我們可以用distinct求不重復的數據有多少&#xff0c;也可以用group by。 這里有個例子&#xff0c;如下表sheet1&#xff0c;共有5411條數據 查詢語句 共有3446條不重復數據&#xff0c;每條不重復數據出現的次數在第二列顯示&#xff1a;

什么是微服務擴展性和高可用-可擴展性、高可用性和性能

歡迎關注專欄&#xff1a;Java架構技術進階。里面有大量batj面試題集錦&#xff0c;還有各種技術分享&#xff0c;如有好文章也歡迎投稿哦。 Overview 可擴展性、高可用性和性能 術語可擴展性、高可用性、性能和關鍵任務對于不同的組織或組織內的不同部門來說可能意味著不同的…

SQL實現當前行等于前面兩行數據之和

sql實現類似斐波那契數列的功能&#xff0c;即當前數據等于前面兩個數據之和&#xff0c;詳看本文例子 原表&#xff1a; sql語句&#xff08;此處要熟悉JION ON的用法&#xff09; 結果

【大牛系列教學】靠著這份面試題跟答案

開篇閑扯 打工人&#xff0c;打工魂&#xff0c;我們生而人上人。當“資本主義”逐漸禁錮我們人&#xff08;大&#xff09;上&#xff08;韭&#xff09;人&#xff08;菜&#xff09;肉體的時候&#xff0c;那一刻我才明白那個日不落帝國資本主義收割機瑞民族之光幸瑞幸咖啡…

matlab實現二項分布

二項分布 1. 求n次獨立重復試驗中事件A恰好發生k次的概率P。 命令:pdf 或 binopdf 格式:pdf (‘bino’, k, n, p) 或 binopdf (k, n, p) 說明:該命令的功能是計算二項分布中事件A恰好發生k次的概率。pdf為通用函數,bino表示二項分布,binopdf為專用函數,n為試驗總次數,…

【工作感悟】成功入職阿里月薪45K

前言 苦苦尋覓找工作之間&#xff0c;殊不知今日之時乃我心之痛&#xff0c;難道是我不配擁有工作嘛。自面試后他所謂的等待都過去一段時日&#xff0c;可惜在下京東上的小金庫都要見低啦。每每想到不由心中一緊。正處為難之間&#xff0c;手機忽然來了個短信預約后續面試。 我…

Mysql優化技巧

索引優化&#xff0c;查詢優化&#xff0c;查詢緩存&#xff0c;服務器設置優化&#xff0c;操作系統和硬件優化&#xff0c;應用層面優化&#xff08;web服務器&#xff0c;緩存&#xff09;等等。這里的記錄的優化技巧更適用于開發人員&#xff0c;都是從網絡上收集和自己整理…

【工作經驗分享】不會真有人覺得mybatis很難學吧

什么是自旋鎖和互斥鎖&#xff1f; 由于CLH鎖是一種自旋鎖&#xff0c;那么我們先來看看自旋鎖是什么&#xff1f; 自旋鎖說白了也是一種互斥鎖&#xff0c;只不過沒有搶到鎖的線程會一直自旋等待鎖的釋放&#xff0c;處于busy-waiting的狀態&#xff0c;此時等待鎖的線程不會…

華為面試題

技術面試&#xff1a; java&#xff1a; java學了幾年&#xff0c;看過什么書&#xff0c;有沒有看過thinking in java這本書 java的公共父類是什么&#xff0c;object類中有什么方法 object中有個hashcode方法&#xff0c;這個方法是用來做什么的&#xff0c; equal 與 的區…

【工作經驗分享】這些新技術你們都知道嗎

前言 近年來&#xff0c;微服務架構(Microservices Architecture)已經成為一種主流的軟件開發方法論&#xff0c;所謂微服務( Microservices ),就是一些具有足夠小的粒度、能夠相互協作且自治的服務體系。 微服務架構基于分布式系統&#xff0c;同時借助了面向服務架構和企業服…

京東面試題(JAVA)

京東17號一面問題與回答情況&#xff08;Java崗&#xff09; 作者&#xff1a;牛客190525號 Q1: HashMap的原理, 以及HashMap如何擴充bucket的大小 A1: 原理答上來了&#xff0c;如何擴容瞎答的&#xff0c;之前不知道擴容之后已經哈希的MapEntry如何處理&#xff0c;當時就…

【微信小程序】使用Hystrix的插件機制

前言 在本篇文章開始前&#xff0c;我想想來回答一個問題&#xff1a;我為什么要寫這一篇關于面試的文章&#xff1f; 原因有三&#xff1a;第一&#xff0c;我想為每一個為夢想時刻準備著的”有心人“盡一份自己的力量&#xff0c;提供一份高度精華的Java面試清單&#xff1…

大話數據結構——數據結構緒論

數據&#xff1a;描述客觀事物的符號&#xff0c;是計算機可以操作的對象&#xff0c;是能被計算機識別&#xff0c;并輸入給計算機處理的符號集合。 有兩個要素&#xff1a; 可以輸入到計算機中能被計算機程序處理 數據元素&#xff1a;組成數據的基本單位&#xff0c;也就…

【微信小程序】目前最全的《Java面試題及解析》

開頭 在找工作的過程中&#xff0c;對于 Redis 技術知識的掌握已經成為必須的技能。美團面試常常就會被問到Redis相關知識&#xff0c;而這次我就差點倒在了美團3面&#xff0c;面試官連問我以下幾個Redis的問題&#xff0c;然后就卡殼了… redis了解嗎&#xff1f;你說說怎么…

大話數據結構——算法

算法&#xff1a;算法是解決特定問題求解步驟的描述&#xff0c;在計算機中表現為指令的有限序列&#xff0c;并且每條指令表示一個或多個操作。 為什么把數據結構和算法一起說&#xff1f; 想想羅密歐與朱麗葉&#xff0c;梁山伯和祝英臺&#xff0c;少了一個你總會覺得奇怪…

java線上培訓班學費一般多少,成長路線圖

前言 眾所皆知的&#xff0c;Linux的核心原型是1991年由托瓦茲(Linus Torvalds)寫出來的&#xff0c;但是托瓦茲為何可以寫出Linux這個操作系統?為什么它要選擇386的計算機來開發?為什么Linux的發展可以這么迅速?又為什么Linux是免費的?以及目前為何有這么多的 Linux版本(…

將visio的圖片插入latex(png格式轉換成eps格式圖片)

EPS和PDF轉換工具&#xff1a;http://www.xdowns.com/tag.asp?keywordEPS%D7%AApdf 這個軟件親測可以轉換&#xff0c;但是&#xff0c;仍然不能插入latex中&#xff0c;就像之前曾嘗試強制改變后綴名轉成eps一樣&#xff0c;效果是不佳的。 樓主的圖是在visio上畫的&#x…

java線程池使用實戰,太牛了!

前言 今天這篇文章中簡單介紹一下一個 Java 程序員必知的 Linux 的一些概念以及常見命令。 如果文章有任何需要改善和完善的地方&#xff0c;歡迎在評論區指出&#xff0c;共同進步&#xff01;筆芯&#xff01; 正式開始 Linux 之前&#xff0c;簡單花一點點篇幅科普一下操作…

大數據基礎技術和應用

大數據概述 數據的表現形式&#xff1a; 線下數據信息化&#xff1a;數據庫、文字記錄、照片……互聯網-移動互聯網&#xff1a;網頁數據、用戶行為記錄、數字圖像……傳感器&#xff1a;設備監控、智能家居、攝像頭…… 大數據的4V特征&#xff1a; 大量化&#xff08;Vol…

java線程池參數面試題,附贈復習資料

前言 作為同時具備高性能、高可靠和高可擴展性的典型鍵值數據庫&#xff0c;Redis不僅功能強大&#xff0c;而且穩定&#xff0c;理所當然地成為了大型互聯網公司的首選。 眾多大廠在招聘的時候&#xff0c;不僅會要求面試者能簡單地使用Redis&#xff0c;還要能深入地理解底…