首頁 後端開發 php教程 根據多年經驗整理的《互聯網MySQL開發規範》

根據多年經驗整理的《互聯網MySQL開發規範》

Jul 25, 2016 am 08:46 AM

歡迎加入
寫在前面:無規矩不成方圓。對於剛加入互聯網的朋友們,肯定會接觸到MySQLMySQL作為互聯網最受歡迎的關係型資料庫產品,它有它擅長的地方,也有它不足的短板,針對它的特性,結合互聯網大多應用的特點,筆者根據自己多年互聯網公司的 MySQL DBA經驗,現總結出互聯網MySQL的一些開發規範,僅供參考。
一、基本規範(1)
使用INNODB存儲引擎(2)
表字符集使用UTF8(3)
所有表格都需要加入註解(4)
單表資料量建議控制在 5000W以內(5)
不在資料庫中儲存圖、檔案等大數據(6)
(6) 禁止在線上做數據庫壓力測試
(7)
從測試、開發環境直連資料庫
二、命名規範
(1)
庫名表名字段名必須有固定的命名長度, 12個字符以內(2) 庫名、表名、欄位名禁
止超過32止超過32止超過32止>個字元。須見名之意(3) 庫名、表名、欄位名禁庫名、表名、欄位名禁
止使MySQL
保留字(4) (4) (4) 必須以臨時庫、表名必須以暫時庫名🎜>tmp為前綴,並以⽇⽇
(5) 備份庫、表必須以bak為前綴,並以日期為後綴
三、庫、表、字段開發設計規範
(1) 使用分區表
(2) 拆分大字段和訪問頻率低的字段,分離冷熱資料
(3) HASH散表,表名後綴使⽤⼗進制數,下標從0開始(4)
按日期時間分錶需符合YYYY[MM][DD][HH]格式 (5)
採用適當的分庫分錶策略。例如千庫十表、十庫百表等(6)
盡量不使用盡量不使用TEXTBLOB類型
類型 DECIMAL代替FLOATDOUBLE
存儲精確浮點數(8) 越簡單越好:將字符轉化為數字、使用TINYINT來代替ENUM
類型(9) 所有欄位定義為
NOT NULL(10) 使用UNSIGNED
儲存非負整數>
(11) INT型別佔用44
位元組。 (12) 使用timestamp
timestamp(13) 使用INT UNSIGNED
INT UNSIGNEDIPV4(14) 使用
VARBINARY使用VARBINARY大小寫敏感的變長字串
(15) 禁止在資料庫中儲存明文密碼,把密碼加密後儲存
(16) 用好數值類型欄位
Tinyint      (1Byte)
mediumint   (3Byte)
int         (4Byte)int         (4Byte)
int         (4Byte)
🎜> tr>  0
  類型  
位元組
最小值
  
类型
  
字节
最小值
最大值
(带符号的/无符号的)
(带符号的/无符号的)
TINYINT
1
-128
127
无符号
  
0
255
SMALLINT
2
-32768
32767
无符号
  
0
65535
MEDIUMINT
3
-8388608
8388607
无符号
  
0
16777215
INT
4
-2147483648
2147483647
无符号
  
0
4294967295
BIGINT
8
-9223372036854775808
9223372036854775807
无符号
  
0
18446744073709551615
最大值
(帶符號的/無符號的) (帶符號的/無符號的)
TINYINT 1 -128 127
無符號   0 255
SMALLINT 2 -32768 32767
無符號 65535
MEDIUMINT 3 -8388608 838860783886078388607
無符號 td>   0 16777215
INT 4 -2147483648 2147483647
無符號   0 4294967295 td>
BIGINT 8 -9223372036854775808
無符號   0 18446744073709551615
如果數值字段沒有那麼大,就不要用 bigint
(17) 存儲ip最好用int儲存而非char(15)
(18) 不允許使用ENUM
(19) 避免使用避免使用避免使用
避免使用避免使用欄位NULL欄位很難查詢最佳化,
欄位的索引需要額外空間,NULL欄位的複合索引無效(20) 少用text/blob
/char >的效能會比text
高很多,實在避免不了
blobblob
,請拆表
(21)
資料庫中不允許儲存大文件,或是照片,可以將大文件物件放到磁碟上,資料庫中儲存它的路徑
四、索引規格
1、索引的數量要控制: 1)
單張表中索引數量不超過5(2) 單個索引中的字段數不超過5
(3) 對字串使
用前綴用前綴
用前綴索引,前綴索引長度不超過
8個字符
(4) 建議優先考慮前綴索引,必要時可添加偽列並建立索引
2、主鍵準則(1) 表格必須有主鍵(2)
(2) 不使用更新頻繁的列作為主鍵(3) 盡量不選擇字串列作為主鍵(4) 不使用UUID MD5 HASH這些作為主鍵(數值太離散了)
(5) 默認使非空的唯一鍵作為主鍵
(6) 建議選擇自增或發號器
3、重要的SQL必須被索引,例如:
必須被索引,例如:(1) UPDATEDELETE語句的語句的
條件列(2) ORDER BY
GROUP BYDISTINCT的字段
4、多表JOIN
的欄位注意以下: (1)
區分度最大的字段放在前面
(2)
SQL
優先考慮覆蓋索引優先考慮覆蓋索引
優先權>避免冗餘和重複索引
(4) 索引要綜合評估資料密度和分佈以及考慮查詢和更新比例
5、索引禁忌
、索引禁忌、索引禁忌
、索引禁忌、索引禁忌>(1)
不在低基數列上建立索引,例如「性別」
(2) 不在索引列進行數學運算與函數運算6、盡量不使用外鍵(1) 外鍵用來保護參考完整性,可在業務端實現(22 ) 對父表和子表的操作會互相影響,降低可用性
77
索引命名:非唯一索引必須以 idx_欄位1_1_欄位🎜>1_欄位2命名,唯一所以必須以uniq_欄位欄位欄位欄位字段1_字段2命名,索引名稱必須全部小寫 8、新建的唯一索引必須不能和主鍵重複
9、索引欄位的預設值不能為NULL,要改為其他的default或空。 NULL非常影響索引的查詢效率
10 、重複檢視與表格相關的SQL,符合最左字首的特性建立索引。多條欄位重複的語句,要修改語句條件欄位的順序,為其建立一個聯合索引,減少索引數量
11 、能使用唯一索引就要使用唯一索引,提高查詢效率
12、研發要經常使用 explain,如果發現索引選擇性差,必須讓他們學會使用hint
hint
五、SQLSQL規範🎜>(1) sql語句盡量簡單
大的
sql想辦法拆成小的sql
(充分利用
QUERY CACHE並充分利用多核多CPU)(2) 事務要簡單,整個交易的時間長度不要太長 (3)
避免使用觸發器、函數、預存程序(4🎜>(4 ) 降低業務耦合度,為sacle outs>
留有餘地(5) 避免在資料庫中進 數學運算
(MySQL
判斷)(4) 不要用select *select >,查詢哪幾個欄位就select 這幾個欄位
(5) sql 中使用到OR的改寫為用 IN()的效率沒有in的效率高)
(6) in裡面數字的個數建議控制在1000以內以內
(7) limit分頁注意效率。 Limit越大,效率越低。可以改寫limit,例如範例改寫:
select id fromtlimit; select id from t where id > 10000 limit10;
(9)
替代union(10) 避免使避免使 >
大表的JOINJOIN
(111) 使用group by
分組、自動排序
(12) 資料的更新要打散後批次更新,不要一次更新太多資料
(13) 減少與資料庫的互動次數
(13)
注意使用效能分析工具 Sql explain  / showprofile   /    mysqlsla(14) SQL
語句要求所有研發, 🎜>關鍵字全部是大寫,每個字只允許有一個空格(15) SQL語句不可以出現隱式轉換,比如
select id from where id='1'(16) IN條件裡面的數據數量要少,我記得應該是500個以內,要學會用exist代替ininin
>exist在一些場景查詢會比in(17) 能不用NOT IN
就不用就不用NOTIN,坑太多了。 。會把空和NULL給查出來(18)
在SQL語句中,禁止使用前綴是%%%的like
(19) 不使用負向查詢,如not in/like
(19) 關於分頁查詢:程式裡建議合理使用分頁來提升效率limitlimit
offset較大要配合子查詢使用(20)
(20)
禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>禁止在🎜>資料庫中跑大查詢(21) 使
使“ 🎜>預編譯語句,只傳參數,比傳遞SQL語句更有效率;一次解析,多次使用;降低SQL注入概率
(22)
禁止使
order by rand()
(23) (23) (23)
(23)
單條SQL單條SQL
六、流程規範(1) 所有的建表操作需要事先告知該表涉及的查詢sql
;
(2) 所有的建表需要確定建立哪些索引後才可以建表上線;(3)
所有的改表結構、加索引操作都需要將涉及到所改表的查詢 sql發出來告知DBA等相關人員;
等相關人員;(4) 在建新表加字段之前,要求研發至少要提前3天郵件出來,給dba們評估、優化和審核的時間
(5) 批次匯入、匯出資料必須事先通知DBA協助觀察(6) 禁⽌在線上從庫執行後台管理和統計類查詢在線上從庫執行後台管理和統計類查詢在線上從庫執行後台管理和統計類查詢(7) 禁⽌有super權限的應用程式帳號存在
(8) 推廣活動或上線新功能必須事先通知DBADBA
行流量評估(9)
(9)
(9) 不在業務高峰期批量更新、查詢資料庫免費領取兄弟連IT教育原創linux運維工程師視頻/細說linux教程,詳情諮詢官網客服:http://www .lampbrother.net/linux/學PHP、Linux、HTML5、UI、Android等影片教學(課件筆記影片)!聯繫Q2430675018
         
linux
交流群

478068715
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP記錄:PHP日誌分析的最佳實踐 PHP記錄:PHP日誌分析的最佳實踐 Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

在Laravel中使用Flash會話數據 在Laravel中使用Flash會話數據 Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

php中的捲曲:如何在REST API中使用PHP捲曲擴展 php中的捲曲:如何在REST API中使用PHP捲曲擴展 Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了 簡化的HTTP響應在Laravel測試中模擬了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12個最佳PHP聊天腳本 在Codecanyon上的12個最佳PHP聊天腳本 Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

解釋PHP中晚期靜態結合的概念。 解釋PHP中晚期靜態結合的概念。 Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

自定義/擴展框架:如何添加自定義功能。 自定義/擴展框架:如何添加自定義功能。 Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles