mysql數據庫建表的基本規范


1、創建表的時候必須指定主鍵,並且主鍵建立后最好不要再有數據修改的需求

mysql從5.5版本開始默認使用innodb引擎,innodb表是聚簇索引表,也就是說數據通過主鍵聚集( 主鍵下存儲該行的數據,索引指向主鍵值),如下圖所示:

正是由於這種解構,如果后續對主鍵對應的值進行修改,就會導致索引節點的頻繁分裂,性能會下降非常厲害。因此推薦開發的同事們使用和業務沒有任何關聯的自增id來做主鍵(切記不要使用uuid來做主鍵),此外也可以考慮使用其他的方式來生產自增的ID,比如使用Twitter的snowflake算法或者zk的DistributedAtomicLong來間接實現。使用自增主鍵而不是uuid做主鍵的優點主要有如下幾點:

a、占用的數據量更小

b、數據順序遞增,不會導致索引節點的頻繁分裂

c、數字類型比字符類型效率更高

正確招式:使用自增id作為主鍵

2、創建表選擇字段的時候,在符合業務需求的情況下盡量小,數據類型盡量簡單

數據類型盡量簡單很好理解,比如,使用數字類型要比使用字符類型效率更高,因為不涉及到校對規則和字符集。而字段盡量小,說的是在滿足業務需求的情況下,盡可能小。這么做的好處是:更小的字段類型占用更少的內存,占用更少的磁盤空間,占用更少的磁盤IO,以及占用更少的帶寬。舉個例子,如果一個varchar(50)的字段,不管你存儲了幾個字符,在查詢的時候仍然需要申請50 byte的內存

3、創建表的時候顯式申明存儲引擎

這個沒什么說的,使用什么引擎就申明什么引擎,防止被默認。有句話說得好:如果你不選擇,那你就被選擇,被選擇的結果不一定是你自己想要的。命運還是要掌握的自己手里。

正確招式:顯式申明ENGINE=xxxx;

4、創建表的時候顯式申明字符集

如果不不想被亂碼困擾,就老老實實的申明字符集,還是那句話:如果你不選擇,那你就被選擇,被選擇的結果不一定是你自己想要的。命運還是要掌握的自己手里。

正確的招式:顯式申明DEFAULT CHARSET=xxxx;

5、創建表的時候對經常要查詢的列添加索引或者組合索引

索引直接影響后面的查詢性能,尤其是數據量越大的時候,影響越明顯。作為一個從事DBA生涯超過5年的DBA,遇到過無數次由於沒有添加索引,導致的線上故障,請各位開發和DBA的同事謹記,一定要對經常要查詢的列添加索引或者組合索引,防止線上事故的發生。

正確招式:建表的時候就添加對應INDEX

6、創建表的時候對字段和表添加COMMENT

這個主要是方便后續的維護,之前在小公司做DBA的時候,接手數據庫時由於沒有任何的COMMENT,導致完全不知道對應的表和字段是做什么用的,不得不經常麻煩開發的同事解釋。這個小技巧用一個經典的廣告詞來解釋就是:你好,我也好。

正確招式:對列和表都添加COMMENT做詳細說明;

7、創建表的時候不要添加drop操作

有的開發同事在創建表之前喜歡添加, DROP TABLE IF EXISTS TABLEXXXX; 然后再來個CREATE  TABLE,建議不要這么干,因為我之前遇到過由此帶來的線上故障。將線上正在使用的表drop掉了。建議大家創建表的時候修改為:CREATE TABLE IF NOT EXISTS TABLEXXX .......;

正確招式:CREATE TABLE IF NOT EXISTS TABLEXXX .......;

8、創建表的時候,字段盡量不要為NULL

解決辦法就是設置字段為NOT NULL,並設置字段的默認值。字段盡量不要為NULL的原因如下:

a、NULL需要占用額外的空間存儲;

b、進行比較的時候會更復雜,還會導致你select (column)的時候不准確

c、含有NULL值的列,會對SQL優化產生影響,尤其是組合索引中

具體NULL會帶來的問題大家可以查閱:https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html

正確招式:NOT NULL DEFAULT 'xxxxx';

附上1個機器簡單的標准SQL 范例,大家創建表的時候可以參照下面的范例SQL來創建,范例如下:

CREATE DATABASE IF NOT EXISTS `dev_ops_db`;

CREATE TABLE  IF NOT EXISTS `dev_ops_db`.`monitor_table_holiday` (

`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`holiday_date` date NOT NULL default '1999-01-01' COMMENT '節假日日期',

`holiday_name` varchar(36) NOT NULL default '' COMMENT '節假日名稱',

PRIMARY KEY (`id`),

KEY `holiday_date` (`holiday_date`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='節假日數據表';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM