ip欄位 mysql MySQL庫表設計小技巧

2021-10-18 10:59:31 字數 3040 閱讀 5040

前言:

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

1.int型別的選用

整型字段型別包含 tinyint、smallint、mediumint、int、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來說,存什麼拿到的就是什麼。下面給出幾個常見案例及選擇建議。

如果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欄位型別

mysql支援多種型別,大致可以分為三類 數值 日期 時間和字串 字元 型別。數值型別 型別大小範圍 有符號 範圍 無符號 用途 tinyint 1 位元組 128,127 0,255 小整數值 smallint 2 位元組 32 768,32 767 0,65 535 大整數值 mediumint...

mysql MySQL儲存IP位址

首先就來闡明一下部分人得反問 為什麼要問ip得怎樣存,直接varchar型別不就得了嗎?其實做任何程式設計都要在功能實現的基礎上最大限度的優化效能。而資料庫設計是程式設計中不可忽略的乙個重要部分,所以巧存ip位址可以一定程度獲得很大提公升。在mysql中沒有直接提供ip型別字段,但如果有兩個函式可以...

ip包頭字段詳解

version 版本號 長度4位元。標識目前採用的ip協議的版本號。一般的值為0100 ipv4 0110 ipv6 header length ip包頭長度 4位元。這個欄位的作用是為了描述ip包頭的長度,因為在ip包頭中有變長的可選部分。該部分佔4個bit位,單位為32bit 4個位元組 即本區...