58到家MySQL軍規升級版

一、基礎規范

表存儲引擎必須使用InnoDB
表字符集默認使用utf8,必要時候使用utf8mb4

解讀:

(1)通用,無亂碼風險,漢字3字節,英文1字節

(2)utf8mb4是utf8的超集,有存儲4字節例如表情符號時,使用它

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

解讀:

(1)對數據庫性能影響較大,互聯網業務,能讓站點層和服務層干的事情,不要交到數據庫層

(2)調試,排錯,遷移都比較困難,擴展性較差

禁止在數據庫中存儲大文件,例如照片,可以將大文件存儲在對象存儲系統,數據庫中存儲路徑
禁止在線上環境做數據庫壓力測試
測試,開發,線上數據庫環境必須隔離

二、命名規范

庫名,表名,列名必須用小寫,采用下劃線分隔

解讀:abc,Abc,ABC都是給自己埋坑

庫名,表名,列名必須見名知義,長度不要超過32字符

解讀:tmp,wushan誰TM知道這些庫是干嘛的

庫備份必須以bak為前綴,以日期為后綴

從庫必須以-s為后綴

備庫必須以-ss為后綴

三、表設計規范

單實例表個數必須控制在2000個以內
單表分表個數必須控制在1024個以內
表必須有主鍵,推薦使用UNSIGNED整數為主鍵

潛在坑:刪除無主鍵的表,如果是row模式的主從架構,從庫會掛住

禁止使用外鍵,如果要保證完整性,應由應用程式實現

解讀:外鍵使得表之間相互耦合,影響update/delete等SQL性能,有可能造成死鎖,高并發情況下容易成為數據庫瓶頸

建議將大字段,訪問頻度低的字段拆分到單獨的表中存儲,分離冷熱數據

解讀:具體參加《如何實施數據庫垂直拆分》

四、列設計規范

根據業務區分使用tinyint/int/bigint,分別會占用1/4/8字節
根據業務區分使用char/varchar

解讀:

(1)字段長度固定,或者長度近似的業務場景,適合使用char,能夠減少碎片,查詢性能高

(2)字段長度相差較大,或者更新較少的業務場景,適合使用varchar,能夠減少空間

根據業務區分使用datetime/timestamp

解讀:前者占用5個字節,后者占用4個字節,存儲年使用YEAR,存儲日期使用DATE,存儲時間使用datetime

必須把字段定義為NOT NULL并設默認值

解讀:

(1)NULL的列使用索引,索引統計,值都更加復雜,MySQL更難優化

(2)NULL需要更多的存儲空間

(3)NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in時有大坑

使用INT UNSIGNED存儲IPv4,不要用char(15)
使用varchar(20)存儲手機號,不要使用整數

解讀:

(1)牽扯到國家代號,可能出現+/-/()等字符,例如+86

(2)手機號不會用來做數學運算

(3)varchar可以模糊查詢,例如like ‘138%’

使用TINYINT來代替ENUM

解讀:ENUM增加新值要進行DDL操作

五、索引規范

唯一索引使用uniq_[字段名]來命名
非唯一索引使用idx_[字段名]來命名
單張表索引數量建議控制在5個以內

解讀:

(1)互聯網高并發業務,太多索引會影響寫性能

(2)生成執行計劃時,如果索引太多,會降低性能,并可能導致MySQL選擇不到最優索引

(3)異常復雜的查詢需求,可以選擇ES等更為適合的方式存儲

組合索引字段數不建議超過5個

解讀:如果5個字段還不能極大縮小row范圍,八成是設計有問題

不建議在頻繁更新的字段上建立索引
非必要不要進行JOIN查詢,如果要進行JOIN查詢,被JOIN的字段必須類型相同,并建立索引

解讀:踩過因為JOIN字段類型不一致,而導致全表掃描的坑么?

理解組合索引最左前綴原則,避免重復建設索引,如果建立了(a,b,c),相當于建立了(a), (a,b), (a,b,c)

六、SQL規范

禁止使用select *,只獲取必要字段

解讀:

(1)select *會增加cpu/io/內存/帶寬的消耗

(2)指定字段能有效利用索引覆蓋

(3)指定字段查詢,在表結構變更時,能保證對應用程序無影響

insert必須指定字段,禁止使用insert into T values()

解讀:指定字段插入,在表結構變更時,能保證對應用程序無影響

隱式類型轉換會使索引失效,導致全表掃描
禁止在where條件列使用函數或者表達式

解讀:導致不能命中索引,全表掃描

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

解讀:導致不能命中索引,全表掃描

禁止大表JOIN和子查詢
同一個字段上的OR必須改寫問IN,IN的值必須少于50個
應用程序必須捕獲SQL異常

解讀:方便定位線上問題

說明:本軍規適用于并發量大,數據量大的典型互聯網業務,可直接帶走參考,不謝。

軍規練習:為什么下列SQL不能命中phone索引?

select uid from user where phone=13811223344

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

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

相關文章

jsp 中包含 一個路徑為變量的文件

<head><base href"<%basePath%>"><% String fileroot"MyJsp.jsp"; %> </head><body><jsp:include page"<%fileroot %>" ></jsp:include></body>

FFMPEG中H.264的算法文檔--整理自ffmpeg論壇等

xchg_mb_border() 交換 MB 邊界的像素。閱讀代碼可知&#xff0c;交換雙方為邊界緩存 (left_border,top_borders) 與重建圖象中的相應數據。其中 xchg 參數是否為 1 決定&#xff0c;在從邊界緩存賦值到重建圖象的同時&#xff0c;是否保存重建圖象的數據到邊界緩存。 此函數僅…

python局部靜態變量_全局變量、局部變量和靜態變量

全局變量和局部變量在寫代碼時需要區分清楚&#xff0c;不然會出大問題。不同語言定義不同范圍的變量的寫法有很大的區別。那么靜態變量是在什么場景下用到呢&#xff1f;我們來假設這樣一個場景&#xff1a;在函數內部定義的變量&#xff0c;當程序執行到它的定義處時&#xf…

【轉載】fullpage.js學習

參考網址&#xff1a;http://www.dowebok.com/77.html 上面有詳細介紹及案例展示&#xff0c;很不錯哦&#xff0c;可以先去看看demo 一、簡介 fullPage.js 是一個基于jQuery的插件&#xff0c;它能夠很方便、很輕松的制作出全屏網站&#xff0c;主要功能有&#xff1a; 1.支持…

Deepin 下安裝 LAMP

ubuntu/deepin linux 下使用 apt-get 安裝所需套的軟件 LAMP 1. 安裝 apacache2 apt-get install apache2 配置文件&#xff1a;/etc/apache2/apache2.conf service apache2 start service apache2 stop service apache2 restart 2. 安裝 mysql sudo apt-get install my…

webpack打包測試_webpack入門筆記(一)

webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時&#xff0c;它會遞歸地構建一個依賴關系圖(dependency graph)&#xff0c;其中包含應用程序需要的每個模塊&#xff0c;然后將所有這些模塊打包成一個或多個 bundle。webp…

[js高手之路] 跟GhostWu一起封裝一個字符串工具庫-擴展字符串位置方法(4)

本文&#xff0c;我們接著之前的框架繼續擴展&#xff0c;這次擴展了一共有5個與字符串位置相關的方法 between( left, right ) 返回兩個字符串之間的內容&#xff0c; 如果第二個參數沒有傳遞&#xff0c;返回的是找到的第一個參數 之后 到 字符串結尾的所有字符串 如果第二個…

ffmpeg和SDL學習筆記

根據ffmpeg官方網站上的例子程序開始學習ffmpeg和SDL編程。 SDL是一個跨平臺的多媒體開發包。適用于游戲&#xff0c;模擬器&#xff0c;播放器等應用軟件開發。支持linux 、win32 等操作系統。 主要應用&#xff1a; 視頻 設置8bpp或更高的任意色彩深度的視頻模式。如果某個…

百練-16年9月推免-B題-字符串判等

2743:字符串判等 查看提交統計提示提問總時間限制: 1000ms內存限制: 65536kB描述判斷兩個由大小寫字母和空格組成的字符串在忽略大小寫&#xff0c;且忽略空格后是否相等。 輸入兩行&#xff0c;每行包含一個字符串。輸出若兩個字符串相等&#xff0c;輸出YES&#xff0c;否則輸…

mysql中的內置函數

mysql內置函數列表可以從mysql官方文檔查詢&#xff0c;這里僅分類簡單介紹一些可能會用到的函數。 1 數學函數 abs(x) pi() mod(x,y) sqrt(x) ceil(x)或者ceiling(x) rand(),rand(N):返回0-1間的浮點數&#xff0c;使用不同的seed N可以獲得不同的隨機數 round(x, D)&#xff…

待整理

CNN 適合處理圖片類輸入數據&#xff0c;單獨的&#xff0c;數據之間沒有關系。 rnn則適合處理序列類數據&#xff0c;視頻幀&#xff0c;語言。 深度神經網絡一般指隱藏層大于2的神經網絡。深層網絡相對于淺層網絡&#xff0c;表達能力更強。僅有一個隱藏層的神經網絡就能擬合…

希爾伯特變換_學習筆記1-傅里葉變換1

最終目標是解微分方程。第一章首先介紹了一般意義下的傅里葉變換&#xff0c;之后逐漸將傅里葉變換的概念抽象化&#xff0c;將變換的定義域進行拓展。最后少量介紹傅里葉變換在偏微分方程中的應用。習題解答是自己寫的&#xff0c;有的不會&#xff0c;有的不知道對不對。傅里…

使用 sitemesh/decorator裝飾器裝飾jsp頁面(原理及詳細配置)

摘要&#xff1a;首先這個Decorator解釋一下這個單詞&#xff1a;“裝飾器”&#xff0c;我覺得其實可以這樣理解&#xff0c;他就像我們用到的Frame&#xff0c;他把每個頁面共有的東西提煉了出來&#xff0c;也可能我們也會用各種各樣的include標簽&#xff0c;將我們的常用頁…

FFPLAY的原理(一)

概要電影文件有很多基本的組成部分。首先&#xff0c;文件本身被稱為容器Container&#xff0c;容器的類型決定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接著&#xff0c;你有一組流&#xff0c;例如&#xff0c;你經常有的是一個音頻流和一個視頻流。&…

安卓開發 新浪微博share接口實現發帶本地圖片的微博

1.微博share接口 在開始之前&#xff0c;我們先看一下要用到的這個接口&#xff1a; 我們這次是要上傳本地圖片&#xff0c;可以很明確的知道&#xff0c;除了要用POST方式提交請求&#xff0c;還要采用multipart/form-data編碼方式。 那么這個multipart/form-data編碼方式是什…

python編寫裝飾器_我也來寫一下python裝飾器

有借用&#xff0c;但原文出處已經找不到了&#xff0c;根據筆記分享一下解釋器的基礎。下面的代碼表示&#xff0c;等待兩秒鐘&#xff0c;輸出‘test is running。現在要求增加統計程序運行時間的功能。等待兩秒鐘&#xff0c;輸出‘test is running,現要求增加統計程序運行時…

VirtualBox安裝Centos6.8出現——E_INVALIDARG (0x80070057)

VirtualBox使用已有的虛擬硬盤出錯&#xff1a; 問題描述&#xff1a;UUID已經存在 Cannot register the hard disk E:\system_iso\centos6.8.vdi {05f096aa-67fc-4191-983d-1ed00fc6cce9} because a hard disk E:\system_iso\centos68_02\centos6.8.vdi with UUID {05f096aa-6…

DFT 與 ATPG綜 述

DFT 可測試性設計 工程會接觸 DFT。需要了解 DFT 知識&#xff0c;但不需要深入。 三種基本的測試&#xff08;概念來自參考文檔&#xff09;&#xff1a; 邊界掃描測試&#xff1a;Boundary Scan Test: 測試目標是 IO-PAD&#xff0c;利用 JTAG 接口互連以方便 測試。&#x…

非線性動力學_非線性動力學特輯 低維到高維的聯通者

序言&#xff1a; 本文將以維度為主線&#xff0c; 帶量大家進入非線性動力學的世界。 文章數學部分不需要全部理解&#xff0c; 理解思維方法為主非線性動力學&#xff0c;是物理學的思維進入傳統方法所不能解決的問題的一座豐碑。它可以幫助我們理解不同復雜度和時間空間尺度…

Go語言channel與select原理

本文會嘗試解釋 go runtime 中 channel 和 select 的具體實現&#xff0c;部分內容來自 gophercon2017。Go版本為1.8.3channel 第一部分講述一下 channel 的用法。channel 可以看做一個隊列&#xff0c;用于多個goroutine之間的通信&#xff0c;例如下面的例子&#xff0c;一個…