導讀:mysql
關於MySQL數據庫規範,相信你們多少看過一些文檔。本篇文章給你們詳細分類總結了數據庫相關規範,從庫表命名設計規範講起,到索引設計規範,後面又給出SQL編寫方面的建議。相信這些規範適用於大多數公司,也但願你們都能按照規範來使用咱們的數據庫,這樣咱們的數據庫才能發揮出更高的性能。sql
tmp_
爲前綴,並以日期爲後綴,備份庫、表以 bak_
爲前綴,並以日期爲後綴。【強制】表和列的名稱必須控制在32個字符之內,表名只能使用字母、數字和下劃線,一概小寫。數據庫
【強制】表名要求模塊名強相關,同一模塊使用的表名儘可能使用統一前綴。緩存
【強制】建立表時必須顯式指定字符集爲utf8或utf8mb4。函數
【強制】列名儘可能不用關鍵字(如type,order等)。性能
【強制】建立表時必須顯式指定表存儲引擎類型,如無特殊需求,一概爲InnoDB。網站
【強制】建表必須有comment。spa
【強制】對於超過100W行的大表進行alter table,必須通過DBA審覈,並在業務低峯期執行,多個alter需整合在一塊兒。 由於alter table會產生表鎖,期間阻塞對於該表的全部寫入,對於業務可能會產生極大影響。設計
【建議】建表時關於主鍵:表必須有主鍵 (1)強制要求主鍵爲id,類型爲int或bigint,且爲auto_increment 建議使用unsigned無符號型。code
(2)標識表裏每一行主體的字段不要設爲主鍵,建議設爲其餘字段如user_id,order_id等,並創建unique key索引。 由於若是設爲主鍵且主鍵值爲隨機插入,則會致使innodb內部page分裂和大量隨機I/O,性能降低。
【建議】核心表(如用戶表)必須有行數據的建立時間字段create_time和最後更新時間字段update_time,便於查問題。
【建議】表中全部字段儘可能都是NOT NULL屬性,業務能夠根據須要定義DEFAULT值。 由於使用NULL值會存在每一行都會佔用額外存儲空間、數據遷移容易出錯、聚合函數計算結果誤差等問題。
【建議】中間表用於保留中間結果集,名稱必須以tmp_
開頭。備份表用於備份或抓取源錶快照,名稱必須以bak_
開頭。中間表和備份表按期清理。
【示範】一個較爲規範的建表語句:
CREATE TABLE user_info (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`user_id` bigint(11) NOT NULL COMMENT '用戶id',
`username` varchar(45) NOT NULL COMMENT '真實姓名',
`email` varchar(30) NOT NULL COMMENT '用戶郵箱',
`nickname` varchar(45) NOT NULL COMMENT '暱稱',
`birthday` date NOT NULL COMMENT '生日',
`sex` tinyint(4) DEFAULT '0' COMMENT '性別',
`short_introduce` varchar(150) DEFAULT NULL COMMENT '一句話介紹本身,最多50個漢字',
`user_resume` varchar(300) NOT NULL COMMENT '用戶提交的簡歷存放地址',
`user_register_ip` int NOT NULL COMMENT '用戶註冊時的源ip',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
`user_review_status` tinyint NOT NULL COMMENT '用戶資料審覈狀態,1爲經過,2爲審覈中,3爲未經過,4爲還未提交審覈',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_user_id` (`user_id`),
KEY `idx_username`(`username`),
KEY `idx_create_time_status`(`create_time`,`user_review_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='網站用戶基本信息'
複製代碼
pk_
開頭,惟一鍵以 uniq_
或 uk_
開頭,普通索引以 idx_
開頭,一概使用小寫格式,以字段的名稱或縮寫做爲後綴。