日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql设计技巧_MySQL库表设计小技巧

發布時間:2024/1/23 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql设计技巧_MySQL库表设计小技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

在我們項目開發中,數據庫及表的設計可以說是非常重要,我遇到過很多庫表設計比較雜亂的項目,像表名、字段名命名混亂、字段類型設計混亂等等,此類數據庫后續極難維護與拓展。我一直相信只有優秀的庫表設計才能發揮出MySQL最大的性能,前面有篇文章也分享了數據庫的使用規范,本篇文章主要講幾個庫表設計的小技巧,希望對大家有所啟發。

1.int類型的選用

整型字段類型包含 tinyint、smallint、mediumint、int、bigint 五種,占用空間大小及存儲范圍如下圖所示:

存儲字節越小,占用空間越小。所以本著最小化存儲的原則,我們要盡量選擇合適的整型,下面給出幾個常見案例及選擇建議。

根據存儲范圍選擇合適的類型,比如人的年齡用 unsigned tinyint(范圍 0~255,人的壽命不會超過 255 歲);海龜就必須是smallint,但如果是太陽的年齡,就必須是int。

若存儲的數據為非負數值,建議使用 UNSIGNED 標識,可以擴大正數的存儲范圍。

短數據使用 TINYINT 或 SMALLINT,比如:人類年齡,城市代碼。

存儲狀態變量的字段用?TINYINT ,比如:是否刪除,0代表未刪除 1代表已刪除。

主鍵列,無負數,建議使用 INT UNSIGNED 或者 BIGINT UNSIGNED;預估字段數字取值會超過 42 億,使用 BIGINT 類型。

下面給出建表語句示范:

CREATE TABLE `tb_int` (

`increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',

`stu_age` tinyint unsigned NOT NULL COMMENT '學生年齡',

`is_deleted` tinyint unsigned DEFAULT '0' COMMENT '0:未刪除 1:刪除',

`col1` bigint NOT NULL COMMENT 'bigint字段',

PRIMARY KEY (`increment_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='int測試表';

2.時間類型的選用

時間字段類型可以選用datetime和timestamp,下面用一張表展示下二者的區別:

timestamp翻譯為漢語即"時間戳",它是當前時間到 Unix元年(1970 年 1 月 1 日 0 時 0 分 0 秒)的秒數,占用4個字節,而且是以UTC的格式儲存,它會自動檢索當前時區并進行轉換。datetime以8個字節儲存,不會進行時區的檢索。也就是說,對于timestamp來說,如果儲存時的時區和檢索時的時區不一樣,那么拿出來的數據也不一樣。對于datetime來說,存什么拿到的就是什么。下面給出幾個常見案例及選擇建議。

根據存儲范圍來選取,比如生產時間,保質期等時間建議選取datetime,因為datetime能存儲的范圍更廣。

記錄本行數據的插入時間和修改時間建議使用timestamp。

和時區相關的時間字段選用timestamp。

如果只是想表示年、日期、時間的還可以使用 year、 date、 time,它們分別占據 1、3、3 字節,而datetime就是它們的集合。

如果timestamp字段經常用于查詢,我們還可以使用MySQL內置的函數FROM_UNIXTIME()、UNIX_TIMESTAMP(),將日期和時間戳數字來回轉換,轉換后可以用 INT UNSIGNED 存儲時間,數字是連續的,占用空間更小,并且可以使用索引提升查詢性能。下面給出示范建表語句及時間戳相關轉換SQL:

CREATE TABLE `tb_time` (

`increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',

`col1` datetime NOT NULL DEFAULT '2020-10-01 00:00:00' COMMENT '到期時間',

`unix_createtime` int unsigned NOT NULL COMMENT '創建時間戳',

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',

`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',

PRIMARY KEY (`increment_id`),

KEY `idx_unix_createtime` (`unix_createtime`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='time測試表';

# 插入數據

insert into tb_time (unix_createtime,create_time) values

(UNIX_TIMESTAMP(now()),now());

# 時間戳數字與時間相互轉換

select UNIX_TIMESTAMP('2020-05-06 00:00:00')

select FROM_UNIXTIME(1588694400)

3.存儲IP值

IP值一般使用char或varchar進行存儲,但是當進行查找和統計時,字符類型不是很高效。MySQL數據庫內置了兩個IP相關的函數INET_ATON()、INET_NTOA(),可以實現 IP 地址和整數類型的轉換。轉換后使用可以INT UNSIGNED 來存儲IP,轉換后的數字是連續的,提高了查詢性能,占用空間更小。

CREATE TABLE `tb_ip` (

`increment_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',

`name` varchar(100) NOT NULL COMMENT '姓名',

`inet_ip` int(10) unsigned NOT NULL COMMENT 'IP',

PRIMARY KEY (`increment_id`),

KEY `idx_inet_ip` (`inet_ip`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ip測試表';

# 插入數據

insert into `tb_ip` (`name`,`inet_ip`) values

('wang',INET_ATON('192.168.0.1')),('lisi',INET_ATON('192.168.0.2'));

# 相互轉換

select INET_ATON('192.168.0.1');

select INET_NTOA(3232235521);

總結:

本篇文章分享了幾個庫表設計及字段類型選取的建議。這些案例都是常常見到的場景,對于int類型及時間類型的選取,本文也根據常見場景給出相關建議,希望大家讀完這篇文章有所收獲。其實庫表設計是件復雜的事情,需要在項目前期多方人員共同規劃討論。還是那句話,只有優秀的庫表設計才能發揮出MySQL最大的性能。

總結

以上是生活随笔為你收集整理的mysql设计技巧_MySQL库表设计小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。