yyblog2.0 數據庫開發規范

一、基礎規范

(1)必須使用InnoDB存儲引擎

解讀:支持事務、行級鎖、并發性能更好、CPU及內存緩存頁優化使得資源利用率更高

(2)表字符集默認使用utf8,必要時候使用utf8mb4

解讀:1、通用,無亂碼風險,漢字3字節,英文1字節。2、utf8mb4是utf8的超集,有存儲4字節例如表情符號時,使用它

(3)數據表、數據字段必須加入中文注釋

解讀:N年后誰tm知道這個r1,r2,r3字段是干嘛的

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

解讀:1、對數據庫性能影響較大,互聯網業務,能讓站點層和服務層干的事情,不要交到數據庫層。2、調試,排錯,遷移都比較困難,擴展性較差。

再劃個重點,高并發大數據的互聯網業務,架構設計思路是“解放數據庫CPU,將計算轉移到服務層”,并發量大的情況下,這些功能很可能將數據庫拖死,業務邏輯放到服務層具備更好的擴展性,能夠輕易實現“增機器就加性能”。數據庫擅長存儲與索引,CPU計算還是上移吧。

(5)禁止存儲大文件或者大照片

解讀:為何要讓數據庫做它不擅長的事情?大文件和照片存儲在文件系統,數據庫里存URI多好

二、命名規范

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

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

?(2)庫名,表名,列名必須見名知義,長度不要超過32字符,禁止拼音英文混用

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

(3)表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

(4)SQL語句中關鍵字大寫,并放在單獨的行開始

三、表設計規范

(1)單實例表數目必須小于2000個

(2)單表列數目必須小于80個

(3)表必須有主鍵,推薦使用UNSIGNED整數,禁止使用字符串作為主鍵

解讀:1、主鍵要選擇較短的數據類型,?Innodb引擎普通索引都會保存主鍵的值,較短的數據類型可以有效的減少索引的磁盤空間,提高索引的緩存效率。2、?無主鍵的表刪除,在row模式的主從架構,會導致備庫夯住

(4)禁止使用外鍵,如果有外鍵完整性約束,需要應用程序控制

解讀:外鍵會導致表與表之間耦合,update與delete操作都會涉及相關聯的表,十分影響sql?的性能,甚至會造成死鎖。高并發情況下容易造成數據庫性能,互聯網業務場景數據庫使用以性能優先

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

四、字段設計規范

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

(2)根據業務區分使用char/varchar

解讀:1、字段長度固定,或者長度近似的業務場景,適合使用char,能夠減少碎片,查詢性能高。2、字段長度相差較大,或者更新較少的業務場景,適合使用varchar,能夠減少空間

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

解讀:1、NULL的列使用索引,索引統計,值都更加復雜,MySQL更難優化 2、NULL需要更多的存儲空間 3、NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in時有大坑,參見我之前寫的:mysql中不等于過濾null的問題

(4)禁止使用double存儲貨幣,推薦decimal

解讀:你就不擔心錢對不上嗎

(5)使用varchar(20)存儲手機號,不要使用整數

解讀:1、牽扯到國家代號,可能出現+/-/()等字符,例如+86。 ?2、手機號不會用來做數學運算。3、varchar可以模糊查詢,例如like ‘138%’

五、索引設計規范

(1)單表索引建議控制在5個以內

(2)禁止在更新十分頻繁、區分度不高的屬性上建立索引

解讀:1、更新會變更B+樹,更新頻繁的字段建立索引會大大降低數據庫性能。2、“性別”這種區分度不大的屬性,建立索引是沒有什么意義的,不能有效過濾數據,性能與全表掃描類似。一般來說,同值的數據超過表的百分之十五,那就沒必要建索引了

(3)建立組合索引,必須把區分度高的字段放在前面

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

六、SQL使用規范

(1)禁止使用SELECT *,只獲取必要的字段

解讀:1、讀取不需要的列會增加cpu/io/內存/帶寬的消耗。2、指定字段能有效利用索引覆蓋。3、指定字段查詢,在表結構變更時,能保證對應用程序無影響

(2)禁止使用INSERT INTO t_xxx VALUES(xxx),必須顯示指定插入的列屬性

解讀:容易在增加或者刪除字段后出現程序BUG

(3)禁止使用屬性隱式轉換

解讀:SELECT uid FROM t_user WHERE phone=13812345678?會導致全表掃描,而不能命中phone索引。這里應當對13812345678 加上單引號'13812345678?'。實際工作中類型字段的隱式轉換是最多的,需要特別注意。

(4)禁止在WHERE條件列使用函數或者表達式

解讀:導致不能命中索引,全表掃描。這個之前我使用的最多了。==!

SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15'?會導致全表掃描

正確的寫法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')

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

解讀:1、負向查詢條件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,會導致全表掃描。2、%開頭的模糊查詢,會導致全表掃描,注意像'138%'也是會使用索引的。

(6)禁止大表使用JOIN查詢,禁止大表使用子查詢

解讀:會產生臨時表,消耗較多內存與CPU,極大影響數據庫性能

(7)禁止使用OR條件,必須改為IN查詢,IN的值必須少于50個

解讀:舊版本Mysql的OR查詢是不能命中索引的,即使能命中索引,為何要讓數據庫耗費更多的CPU幫助實施查詢優化呢?

(8)多表連接必須使用JOIN,LEFT?JOIN,禁止使用FROM tab1,tab2

解讀:都能實現關聯查詢,但是使用join更加靈活,效率更高。同時使用join會突出主表的存在,方便在mybaits等框架中快速定位sql位置。sql必須放在主表的xml中,便于重用。

結語:本規范將作為yyblog2.0數據庫的開發要求,后續會不斷更新。

yyblog1.0項目地址:https://github.com/allanzhuo/yyblog?歡迎star關注yyblog項目。

參考:架構師之路

轉載于:https://www.cnblogs.com/laoyeye/p/9925449.html

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

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

相關文章

word2016 語法檢查_如何改進Microsoft Word的語法檢查器

word2016 語法檢查Microsoft Word comes with a powerful grammar checker, but many of its advanced grammar detection features are disabled by default. Grammarly is popular, but you don’t need it to add grammar checking to Word. Word itself contains a free al…

linux服務器硬件監控,Linux服務器實時監控加載硬件信息

Linux服務器監控之實時監控加載硬件信息Linux負有盛名的特點之一是其非凡的穩定性。然而&#xff0c;如果您的硬件有缺陷或配置不正確&#xff0c;即使是世界上最穩定的操作系統也不會對您有什么幫助。計算機系統是由軟件系統硬件系統組成的&#xff0c;檢測硬件狀態對于保障整…

Using Python with Oracle

2019獨角獸企業重金招聘Python工程師標準>>> Using Python with Oracle This page discusses using Python with Oracle. The page is based on the cx_oracle Python extension module. It was developed on a VM running Oracle Enterprise Linux 6U4 runnng Orac…

小米oj 反向位整數(簡單位運算)

反向位整數 序號&#xff1a;#30難度&#xff1a;一般時間限制&#xff1a;1000ms內存限制&#xff1a;10M 描述 輸入32位無符號整數&#xff0c;輸出它的反向位。 例&#xff0c;輸入4626149&#xff08;以二進制表示為00000000010001101001011011100101&#xff09;&#xff…

如何在Microsoft Word中插入簽名

Adding your signature to a Microsoft Word document is the ultimate way to personalize it as your own, especially for documents like letters or contracts. If you want to add a signature to a Word document, here’s how. 將簽名添加到Microsoft Word文檔是將其個…

linux 內核fpic,linux編譯動態庫 fPIC作用

標簽&#xff1a;在生成動態庫時&#xff0c;常常習慣性的加上fPIC選項&#xff0c;fPIC有什么作用和意義&#xff0c;加不加有什么區別&#xff0c;這里做下小結&#xff1a;fPIC的全稱是 Position Independent Code&#xff0c; 用于生成位置無關代碼。什么是位置無關代碼&am…

jdk 1結尾和2結尾_“與巢一起工作”的結尾對您意味著什么

jdk 1結尾和2結尾korisbo/Shutterstock科里斯博/ ShutterstockGoogle announced the end of “Works With Nest” at Google I/O 2019. Many companies, from IFTTT to Philips Hue, use Works With Nest to automate your smarthome. Those automations will break soon. Goog…

spring-cloud:利用eureka實現服務提供與調用示例

1.運行環境 開發工具&#xff1a;intellij idea JDK版本&#xff1a;1.8 項目管理工具&#xff1a;Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCloud-learn-demo/tree/master/spring-cloud-eureka-producer-consumer

linux 桌面顯示視頻播放器,Ubuntu 13.10開啟媒體播放器VLC桌面通知的步驟

VLC是一款多功能的媒體播放器&#xff0c;支持眾多音頻及視頻格式&#xff0c;能夠適用于Ubuntu等系統&#xff0c;而VLC播放器有桌面通知功能&#xff0c;需要手動開啟&#xff0c;下面小編就以Ubuntu 13.10為例&#xff0c;給大家詳細介紹下Ubuntu 13.10開啟VLC桌面通知的步驟…

獨家 | 螞蟻金服TRaaS技術風險防控平臺解密

小螞蟻說&#xff1a; 在金融行業&#xff0c;風險防控能力的重要性不言而喻。而螞蟻金服可實現高達99.999%的異地多活容災&#xff0c;千億級資金秒級實時核對“賬、證、實”等能力也讓業界有目共睹。 今年位于杭州的螞蟻金服ATEC科技大會上&#xff0c;螞蟻金服正式推出技術風…

谷歌表格_如何使用宏自動執行Google表格

谷歌表格Google Sheets lets you automate repetitive tasks with macros, and you can then bind them to keyboard shortcuts to execute them quickly. They work using Google Apps Script to capture your actions for later use. Google表格可以讓您使用宏自動執行重復性…

阿里云彈性高性能計算E-HPC強勢來襲,全新打造一站式云超算

為什么80%的碼農都做不了架構師&#xff1f;>>> 摘要&#xff1a; 如今&#xff0c;高性能計算已在不知不覺中滲透到人類生活的方方面面。從材料科學到石油勘探、金融市場、應急管理、醫學和互聯網等領域&#xff0c;高性能計算無一不大顯身手&#xff0c;幫助快速…

linux導出硬件信息,Linux 上生成硬件信息與配置報告: Sysreport

當需要 Linux 主機詳細完整的描述給另一個人的時候&#xff0c;這個工具非常適合。用 root 用戶之行&#xff0c;但要注意最好不要抓取 currently installed packages 信息&#xff0c;這一步非常慢。(用 -norpm 參數)存儲廠商 EMC 也有個 EMCgrab 工具&#xff0c;工作原理類似…

深度優先搜索(DFS)----------------Tju_Oj_3517The longest athletic track

這個題主要考察對樹的操作&#xff0c;主要思想是DFS或者BFS&#xff0c;其次是找樹的直徑方法&#xff08;既要運用兩次BFS/DFS&#xff09;&#xff0c;最后作為小白&#xff0c;還練習了vector的操作。 DFS框架偽碼: bool DSF(Node oneTreePoint ){ //傳入的結點和其他有效…

word中圖片超出頁邊距_如何在Word中更改頁邊距

word中圖片超出頁邊距Word documents open with one-inch margins by default. You can adjust the page margins by choosing one of Word’s predefined options, or you can specify the exact height and width of the margins yourself. Here’s how. 默認情況下&#xff…

Android 中文 API (16) —— AnalogClock

一、結構 public class AnalogClock extends View java.lang.Object android.view.View android.widget.AnalogClock 二、類概述 這是一個帶有時針和分針的模擬時鐘控件。 三、受保護的方法 protected void onAttachedToWindow () 視圖&#xff08;AnalogClock&#xff09;附在…

linux服務器探針軟件,服務器安裝ServerStatus監控探針教程

前言本文將介紹在服務器上安裝ServerStatus來監控多臺服務器的運行狀態的教程.ServerStatus-Toyo版是一個酷炫高逼格的云探針、云監控、服務器云監控、多服務器探針~&#xff0c;該云監控(云探針)ServerStatus-Toyo項目鏈接本文為Stille原創文章.經實踐,測試,整理發布.如需轉載…

iphone播客怎么上傳_如何在iPhone,iPad或Android上收聽播客

iphone播客怎么上傳Khamosh PathakKhamosh PathakDid someone recently recommend you listen to a podcast? If your response was, “What’s a podcast?” we’ve got the answer, and more! Here’s a crash course on podcasts and how you can listen to them on your …

NOIP2018 退役記

NOIP掛完&#xff0c;OI再見 AFO Day 0 早上的高鐵&#xff0c;1點多到廣州&#xff0c;2點多到酒店&#xff0c;下午就是頹頹頹&#xff0c;然后晚上隨便刷了一下板子&#xff0c;反正PJ也沒啥板子可以刷 就這樣浪費了一天&#xff0c;我到底在干嘛 Day 1 早上心態很好的繼續刷…

Linux決心書/李世超

Linux決心書大家好&#xff0c;我叫李世超&#xff0c;來自河北邯鄲。今年24&#xff0c;感覺之前的生活狀態不是自己想要的&#xff0c;每天渾渾噩噩。我覺得人要對自己定一個目標&#xff0c;我的目標就是月薪10K以上&#xff0c;所以我要努力在老男孩教育學習技術。珍惜這五…