《如何創建一張規范的MySQL表》要點:
本文介紹了如何創建一張規范的MySQL表,希望對您有用。如果有疑問,可以聯系我們。
到底怎樣才能創建一張規范的MySQL表?
為什么必定需要有無業務意義的主鍵,并且還需要自增?
應該在哪些字段添加索引?
或許有些人會有以上類似的疑問.這幾天通過本身的整理加上好友的指導,整理了一份稍微規范一點的建表語句.
如下:
規范表示例
MySQL 5.5
CREATE TABLE student_info (
`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',
`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班級',
`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '學號',
`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '總分',
`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '學費',
`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '電話號碼',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記錄創建時間',
`update_time` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '記錄更新時間',
`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表記錄有效,0代表記錄無效',
PRIMARY KEY (`id`),
UNIQUE KEY uniq_stu_num (`stu_num`),
KEY idx_stu_score (`stu_score`),
KEY idx_update_time_tuition (`update_time`, `tuition`)
) ENGINE = INNODB charset = utf8mb4 COMMENT '學生信息表';
MySQL 5.6及以上版本
CREATE TABLE student_info (
`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`stu_name` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '姓名',
`stu_class` VARCHAR (10) NOT NULL DEFAULT '' COMMENT '班級',
`stu_num` INT (11) NOT NULL DEFAULT '0' COMMENT '學號',
`stu_score` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '總分',
`tuition` DECIMAL (5, 2) NOT NULL DEFAULT '0' COMMENT '學費',
`phone_number` VARCHAR (20) NOT NULL DEFAULT '0' COMMENT '電話號碼',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記錄創建時間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '記錄更新時間',
`status` TINYINT NOT NULL DEFAULT '1' COMMENT '1代表記錄有效,0代表記錄無效',
PRIMARY KEY (`id`),
UNIQUE KEY uniq_stu_num (`stu_num`),
KEY idx_stu_score (`stu_score`),
KEY idx_update_time_tuition (`update_time`, `tuition`)
) ENGINE = INNODB charset = utf8mb4 COMMENT '學生信息表';
解釋
1、表的命名:使用有意義的英文詞匯,詞匯中間以下劃線分割,全部采用小寫;如示例表表名student_info
2、表必需有無符號int型自增主鍵,對應示例表中id字段.
必需得有主鍵的原因:
采用RBR模式復制,無主鍵的表刪除,會導致備庫夯住
使用自增的原因:
數據寫入可以提高插入性能,避免page分裂,減少表碎片.
3、必需把字段定義為NOT NULL并且提供默認值
原因:
a.null的列使索引、統計都更加復雜,使優化更加困難
b.NULL并不是空值,也會占用空間,所以在MySQL進行比擬時,NULL會參與字段比擬,所以對效率有一部分影響
4、所有表、字段都應該有 comment ,來描述表、字段所代表的含義,便利同事查看.
5、能用SMALLINT或者tinyint的情況就不用int,如字段 stu_score就使用的是SMALLINT
原因:使用SMALLINT或者tinyint能節約存儲空間
6、涉及到錢的字段建議使用DECIMAL,如示例表字段tuition
7、電話號碼建議使用varchar(20),如示例表字段phone_number
原因:
a.涉及到區號或者國家代號,可能出現+-()
b.不會有誰用手機號做運算吧
c.varchar可以支持模糊查詢
8、表建議增加create_time和update_time,以記錄某條數據的創建時間和修改時間.
注意:這里5.5和5.6有區別,5.5使用的是TIMESTAMP,并且5.5不支持多個CURRENT_TIMESTAMP 默認值,因此如上示例設計;5.6版本使用了datetime,因為datetime支持的范圍更廣(范圍為:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'),并且create_time和update_time兩個字段都設置了CURRENT_TIMESTAMP(從5.6.5開始支持多個字段默認值設置為CURRENT_TIMESTAMP)
原因:增加這兩個字段便利統計和歸檔.
9、表建議包括一個狀態標記字段,來標識數據是否被刪除,而不使用物理刪除;比如示例表字段status.
10、不建議使用ENUM,使用TINYINT來代替;如示例表字段status使用的是TINYINT類型.
原因:增加新的ENUM值要做DDL操作
11、使用唯一索引約束字段值唯一的數據,唯一索引以uniq_字段名方式命名;如示例表中的uniq_stu_num
12、在經常作為查詢條件的字段上添加索引,普通索引以idx_字段名方式命名;如示例表中的idx_stu_score
13、經常同時出現在where條件中的幾個字段可以放在聯合索引中;如idx_update_time_tuition;必要注意的是應該把選擇性更大的列放在聯合索引的最左邊.
14、盡量不使用TEXT、BLOB類型
原因:會浪費更多的磁盤和內存空間,非需要的大量的大字段查詢會淘汰掉熱數據,導致內存命中率急劇降低,影響數據庫性能
15、建議使用innodb存儲引擎
原因:innodb支持事務,是行級鎖,并發性能更好、CPU及內存緩存頁優化使得資源利用率更高.
16、建議使用utf8mb4字符集
原因:萬國碼,無亂碼風險;與utf8編碼相比,能支持Emoji臉色.
《如何創建一張規范的MySQL表》是否對您有啟發,歡迎查看更多與《如何創建一張規范的MySQL表》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7109.html