1、庫名、表名、欄位名必須使用小寫字母並採用下劃線分割;
2、庫名、表名、欄位名支援最多32個字元,統一規範、易於辨識以及減少傳輸量不要超過32;
3、庫名、表名、欄位名禁止使用mysql保留關鍵字;
4、臨時庫、臨時表名必須以tmp為字首並以日期為字尾;
5、備份庫、備份表名必須以bak為字首並以日期為字尾;
1、禁止使用分割槽表
mysql的分割槽表實際效能不是很好,且管理維護成本較高
2、拆分大字段和訪問頻率低的字段,分離冷熱資料
3、採用合理的分庫分表策略,推薦使用hash進行分表,表名字尾使用十進位制數,下標從0開始
首次分表盡量多的分,避免二次分表,二次分表的難度和成本較高
4、按日期時間分表需符合yyyy[mm][dd][hh]格式
5、單表字段數控制在20個以內
6、一條完整的建表語句中應包含必要的字段、主鍵、合理的索引(綜合**中所有的條件語句建立合理的索引)
索引是一把雙刃劍,它可以提高查詢效率但也會降低插入和更新的速度並占用磁碟空間
1、單張表中索參數量不超過5個;
2、單個索引中的字段數不超過5個;
對字串使用字首索引,字首索引長度不超過10個字元;如果有乙個char(200)列,如果在前10個字元內,多數值是惟一的,那麼就不要對整個列進行索引。對前10個字元進行索引能夠節省大量索引空間,也可能會使查詢更快;
3、表必須有主鍵,不使用uuid、md5、hash作為主鍵,盡量不選擇字串列作為主鍵;主鍵建議選擇自增id;
4、建立復合索引時區分度較大的字段放在最前面;不在低區分度的字段上建立索引,例如『性別『;
5、避免冗餘或重複索引
合理建立聯合索引(避免冗餘),index(a,b,c)相當於index(a)、index(a,b)、index(a,b,c);
6、索引不是越多越好,按實際需要進行建立
每個額外的索引都要占用額外的磁碟空間,並降低寫操作的效能
7、不在索引列進行數**算和函式運算;
8、盡量不要使用外來鍵
外來鍵用來保護參照完整性,可在業務端實現,對父表和子表的操作會相互影響,降低可用性;
9、不使用%前導的查詢,如like「%***」,無法使用索引;
10、不使用反向查詢,如not in / not like
無法使用索引,導致全表掃瞄
全表掃瞄導致buffer pool利用降低
1、盡可能不要使用text、blob型別
刪除這種值會在資料表中留下很大的"空洞",可以考慮把blob或text列分離到單獨的表中
2、用decimal代替float和double儲存精確浮點數
浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的資料範圍;浮點數的缺點是會引起精度問題
3、將字元轉化為數字
4、使用tinyint來代替enum型別
5、字段長度盡量按實際需要進行分配,不要隨意分配乙個很大的容量
varchar(n),n表示的是字元數不是位元組數,比如varchar(255),可以最大可儲存255個漢字,需要根據實際的寬度來選擇n;
varchar(n),n盡可能小,因為mysql乙個表中所有的varchar欄位最大長度是65535個位元組,進行排序和建立臨時表一類的記憶體操作時,會使用n的長度申請記憶體;
6、如果可能的話所有欄位均定義為not null
7、使用unsigned儲存非負整數
同樣的位元組數,儲存的數值範圍更大。如tinyint有符號為-128-127,無符號為0-255
8、使用timestamp儲存時間. 因為timestamp使用4位元組,datetime使用8個位元組,同時timestamp具有自動賦值以及自動更新的特性.
9、使用int unsigned儲存ipv4
10、使用varbinary儲存大小寫敏感的變長字串
11、禁止在資料庫中儲存明文密碼
1、使用預編譯語句prepared statement
只傳引數,比傳遞sql語句更高效,一次解析,多次使用,降低sql注入概率
2、盡量避免相同語句由於書寫格式的不同,而導致多次語法分析
3、避免隱式轉換
會導致索引失效,如select userid from table where userid=』 1234』
4、充分利用字首索引
必須是最左字首,不可能同時用到兩個範圍條件
5、避免使用儲存過程、觸發器、events等
讓資料庫做最擅長的事,降低業務耦合度,為sacle out、shading留點餘地,避開bug
6、避免使用大表的join
mysql最擅長的是單錶的主鍵/二級索引查詢
join消耗較多的記憶體,產生臨時表
7、避免在資料庫中進行數**算
容易將業務邏輯和db耦合在一起
mysql不擅長數**算和邏輯判斷
無法使用索引
8、拒絕大sql,拆分成小sql
充分利用query cache
充分利用多核cup
9、使用in代替or,in的值不超過1000個
10、禁止使用order by rand()
因為order by rand()會將資料從磁碟中讀取,進行排序,會消耗大量的io和cpu,可以在程式中獲取乙個rand值,然後通過在從資料庫中獲取對應的值
11、使用union all而不是union
12、程式應有捕獲sql異常的處理機制
13、禁止單條sql語句同時更新多個表
14、不使用select * from
消耗cpu和io、消耗網路頻寬
無法使用覆蓋索引
減少表結構變更帶來的影響
1、批量匯入、匯出資料必須提前通知dba協助觀察;
2、批量更新資料,如update,delete操作,需要dba進行審查,並在執行過程中觀察服務負載等各種狀況;
3、禁止在從庫上執行後台管理和統計類的功能查詢;
4、禁止有super許可權的應用程式賬號存在;
5、產品出現非資料庫導致的故障時及時通知dba協助排查;
6、**活動或上線新功能必須提前通知dba進行流量評估;
7、資料庫資料丟失,及時聯絡dba進行恢復;
8、對單錶的多次alter操作必須合併為一次操作,相同型別的寫操作合併為一條語句;
9、不在mysql資料庫中存放業務邏輯;
10、重大專案的資料庫方案選型和設計必須提前通知dba參與;
11、對特別重要的庫表,提前與dba溝通確定維護和備份優先順序;
12、不在業務高峰期批量更新、查詢資料庫;
13、 提交線上建表需求,必須詳細註明所有相關sql。
mysql 的開發規範 MySQL開發規範
一 基礎規範 1 使用innodb儲存引擎 2 資料庫字符集使用utf8,校對字符集使用utf8 general ci 3 所有表 欄位都盡量新增注釋 4 庫名 表名 欄位名使用小寫字母,禁止超過32個字元,須見名知意 5 非唯一索引以 idx 欄位1 欄位2 命名,唯一索引必須以 uniq 欄位1...
MySQL開發規範
1 單張表中索參數量不超過5個 建議3個左右 如果超時,一般情況下表能夠進行二次拆分。2 單個索引中的字段數不超過5個 建議3個以內 3 對字串使 用字首索引。4 建議優先考慮字首索引,必要時可新增偽列並建立索引。1 表必須有主鍵。2 不使用更新頻繁的列作為主鍵。3 盡量不選擇字串列作為主鍵。4 不...
MySQL開發規範
本文件是為幫助研發與運維人員按照規範使用mysql資料庫,提公升研發寫sql的水平。致力於提供乙個安全,穩定,高效能的資料庫環境。命名規範 1 庫名 表名 欄位名必須使用小寫字母,分割。2 庫名 表名 欄位名不超過12個字元。3 庫名 表名 欄位名禁止使用mysql保留字,見附件。4 庫名 表名 欄...