mysql建表思路 MySQL 建表思路

2021-10-18 00:08:55 字數 2658 閱讀 5878

思想:硬碟如倉庫,表如倉庫中貨架(常用與不常用等分類),欄位如貨物(尺寸是固定或變動),訪問貨物涉及到貨架的佔位、效率。

資料型別選用,建表思路,正規化

資料型別特點

資料型別的速度關係

[ 最快 ] 整形 > date,time > char,enum > varchar > text ,blob [ 最慢 ]

char 與 varchar 選擇

一般情況下,在100個字元內,可以使用 char 定義。(少量字元在使用率上,定長比變長更具有硬碟效能和低損耗【變長需要根據具體長度計算偏移量】的優勢)

資料型別的特點

char(1):需要經過字符集的轉換(排序時涉及字符集校對)。

enum('男','女'):內部使用數值儲存,多了乙個數值轉換

tinyint:無需字符集轉換,直接參與算術運算(cpu內部最基礎的就是算術及邏輯運算),速度更快

舉例應用:性別(tinyint > enum > char)

夠用就好

越大的字段越浪費記憶體,從而影響效能(無論從磁碟載入到記憶體的時間,以及記憶體管理)

null 盡量避免少用

不利於索引

不利於查詢:需要專用的關鍵字實現(is)。例如 where name is null 或 where name != null

不利用邏輯:select null = null ;

小數類double,float 精度有誤差(有四捨五入的特點),不適合作為金額儲存

decimal 沒有精度誤差,適合作為金額儲存

日期時間 時間戳 整形

效能:整形(int,bigbit) > 時間日期(datetime) > 時間戳(timestamp)

跨時區:

datetime --> 時間戳 --> 指定時區。不做任何改變,儲存與查詢一致。

timestamp 按當前環境的時區儲存,查詢按客戶端當前時區返回。(檢視mysql時區變數:select variables like '%time_zone%';)

時間支援:

datetime           支援 9999-12-31 23:59:59

timestamp / int  支援 2038-01-19 03:14:07

綜合:使用 datetime 比較省心

建表思路

定長與變長分離。

常用與不常用分離。

高頻率用到的資訊優先思考效率,不常用的資訊優先考慮空間占用。

1對多的關係中,新增冗餘字段(這與正規化有點違背,但能解決聯表查詢的效能消耗)。如:聯表。

列 型別 注釋

id int unsigned primary key

username varchar(20) -- 優化 --> char(20)

gender char(1) -- 優化 --> tinyint

weight tinyint unsigned

birth date

salary decimal(8,2)

lastlogin datetime

intro varchar(1500) -- 優化 --> 將 intro 字段分離該錶,另外形成乙個新的表(id,username,is_del,intro)

is_del tinyint 是否邏輯刪除(1:真)

正規化正規化:1nf -> 2nf -> 3nf -> bcnf -> 4nf -> 5nf

實際應用中,使用 3nf 或 bcnf(bcnf可理解為 3nf的補丁版) 已經能夠得到很好的結果。4nf以上的正規化是特殊情況下才使用。

1nf:若資料表 r 的每乙個欄位的值為單一的,則 r 屬於【第一階規範化形式】(first normal form)

函式依賴:r(列1,列2,…,列n)為一資料表,且 x,y 為 的部分集合,若找不到兩處記錄,其 x 值相同,y值不同,則 x 功能上確定 y 或 y 函式依賴於 x 。(即 x 字段內容相同記錄,y 字段內容也一樣)。如:身份證號(x) 確定了 姓名(y)

主鍵:r(列1,列2,…,列n)為一資料表,且 x 為的部分集合;若資料表內所有其他列字段都函式依賴與 x,則 x 為 r 的【主鍵】。

2nf:若資料表r屬於1nf,且所有非主鍵的字段皆【完全函式依賴】於主鍵,則r屬於【第二階規範化形式】(second normal form)

3nf:若資料表r屬於2nf,且所有的非主鍵的字段無【傳遞函式依賴】於主鍵,則r屬於【第三階規範化形式】(third normal form)

2nf,3nf 都是對非主屬性(主鍵)的函式依賴提出的限定,並沒有要求消除主屬性(主關鍵字)對候選關鍵字的傳遞依賴。bcnf為此而生。

bcnf:資料表 r 的所有屬性(含主鍵,非主鍵)都不傳遞依賴於 r 的任何候選關鍵字,則 r 屬於 bcnf。

mysql建表建索引6 mysql建表建索引

建表 create table sj projects id int 11 not null auto increment,title varchar 255 not null default comment 專案名稱 platform id int 11 not null default 0 co...

mysql建立使用者表 mysql 建庫建表建使用者

1.建立資料庫 create database school 2.使用資料庫 use school 3.建立使用者 create user jame localhost identified by jame 4.授權使用者 注意這裡是用了 哦,可以自己講school也替換成 號 grant sele...

mysql建表建索引6 Mysql建表 建立索引

建立表時可以直接建立索引,這種方式最簡單 方便。其基本形式如下 create table 表名 屬性名 資料型別 完整性約束條件 屬性名 資料型別 完整性約束條件 屬性名 資料型別 unique fulltext spatial index key 別名 屬性名1 長度 asc desc uniqu...