物理設計
物理設計就是根據所選擇的關系型數據庫的特點對邏輯模型進行存儲結構設計。它涉及的內容包含以下4方面:1. 定義數據庫、表及字段的命名規范;2. 選擇合適的存儲引擎;3. 為表中的字段選擇合適的數據類型;4. 建立數據庫結構。
定義數據庫、表及字段的命名規范
-
數據庫、表及字段的命名要遵守可讀性原則
-
數據庫、表及字段的命名要遵守表意性原則
-
數據庫、表及字段的命名
存儲引擎
- MyISAM存儲引擎是非事務的,鎖粒度是表級的,主要應用於
select,insert,不適合應用於讀寫操作頻繁的場景,因為對於讀寫操作會進行鎖表操作。 - MRG_MYISAM和MyISAM差不多
- Innodb存儲引擎是支持事務,支持MVCC行級鎖,適合任何場景
- Archive存儲引擎不支持事務,支持行級鎖,支持insert、select,適用於隨機讀取、更新、刪除。
- Ndb Cluster是MySQL集群存儲引擎 ,支持事務,支持行級鎖,具有高可用性
數據類型
原則:當一個列可以選擇多種數據類型時,應該優先考慮數值類型,其次是日期或二進制類型,最后是字符類型。對於相同級別的數據
類型,應該優先選擇占用空間小的數據類型。
1. 數值類型
數值類型可以分為整數類型和實數類型。
其中,M表示整數類型的最大顯示寬度; 對於浮點和定點類型,M是可以存儲的總位數(精度);對於字符串類型,M是最大長度。 M
的最大允許值取決於數據類型。注意:當我們只存儲兩位數時,一種錯誤用法就是int(2),其實int(i)存儲空間是由數據類型和是否是
unsigned決定的,i只是表示顯示長度。int(11)和int(1)的存儲空間是沒差別的, int(11)的數據長度如果小於11,則默認補充空格,如果
int (11)字段被zerofill修飾,則默認補充0,而且字段被zerofill修飾會自動添加unsigned。因此,當我們只存儲兩位數時,使用tinyint才能
達到我們簡約空間的目的。
注意:Decimal類型是精確類型的,如果我們需要存儲精確數據,例如財務數據就必須使用Decimal類型,而不能使用float和double類型。
2. 字符串類型
字符串類型中有兩種類型:char和varchar。
varchar(n)的存儲規范
-
varchar存儲變長內容,varchar需要額外的空間記錄內容長度,當內容小於255字節時,需要一個額外字節,當內容大於255字節時,需要2個額外字節;
-
在jbk編碼下,char占2個字節,在UTF-8編碼下,char占用3個字節;
-
MySQL每行最多存儲65535個字節;
-
varchar中的第1個字節表示是否為空,第二個字節和第3個字節表示長度,剩下字節表示實際內容,因此最大可用存儲65535-1-2=65532 ;
create table t1(c varchar(n)) charset=gbk,則此處n的最大值為(65535-1-2)/2=32766 create t(c int ,c2 char(30),c3 varchar(n)) charset=utf8,則此處n的最大值(65535-1-2-4-90)/3=21812
- varchar(100)中的100指的是100個字符數量;
- 使用場景:字符串列的最大長度比平均長度大很多;字符串列很少被更新,由於varchar類型長度不固定,那么進行更新時,可
能導致存儲頁的分裂,引起存儲碎片;使用多字節字符集存儲字符串,以UTF-8為例,存儲中文需要3個字節,而存儲英文或數字只需
要1個字節。
char(n)的存儲規范
-
char類型是定長的;
-
字符串存儲在char類型的列中會刪除末尾的空格(見下圖);
-
char類型的最大寬度是255字節。
-
適用場景: char類型適合存儲長度近似的值,例如身份證、md5值,手機號等;char類型適合存儲短字符串,例如性別字段,
使用char(1)就比varchar(1)更節省空間,因為varchar還需要存儲額外字節存儲其他信息;char類型適合存儲經常更新的字符序列,
由於char類型的長度是固定的,MySQL會一次性地分配存儲空間,在多次更新時也不會出現頁分裂的情況,減少存儲碎片。
3. 日期類型
注意:timestamp占4byte,實際上是用int存儲的。由於只有4byte,因此它只能顯示1970-01-01 到 2038-01-19,也正是這個原因,如
果在這個時間內的字段推薦使用timestamp。timestamp類型顯示依賴於所指定的時區。除此之外,還需要注意一點,**在行的數據
修改時可以自動修改timestamp列的值**,這個特性可以幫助我們在進行數據分析時自動提取出最新變化的數據。
MySQL5.5 datetime類型字段不能設置默認值為now()
MySQL5.6 datetime類型字段可以設置默認值為now()
-
from_unixtime():數字轉換成時間
-
unix_timestamp():時間轉換成數字
-
Date_sub/DATE_ADD:對時間進行加減
-
CURDATE():將當前日期按照'YYYY-MM-DD'
-
NOW():返回當前日期和時間值
建立數據庫結構
1. DML(Data manipulation language,數據操作語言)
- DML分成數據查詢和數據更新兩類,數據更新又分成插入、刪除和修改三種操作,主要命令:
select、insert、delete、update、merge、call、explain、plan。
2. DDL(Data definition language,數據定義語言)
- DDL包括兩種類型數據:數據字典以及數據類型和結構定義。主要命令:
create 、alter、drop、truncate、rename、comment。 Create,用於創建語句,用於創建表或者數據庫或者存儲過程或者其他內容
create table tea(id int not null auto_increment,name varchar(6) not null,remark char(6),primary key(id)); show create table tea;
Alter,一般用於添加或者修改表中的字段名或者字段定義。也可以用於修改字段順序等。同樣的也可以用於修改數據庫的名字或者編碼
修改字段定義:
ALTER TABLE emp MODIFY first_name VARCHAR(20) NOT NULL DEFAULT '-'; 添加字段: alter table emp add column age int(3) not null default 0; 修改字段名字,同時修改定義: alter table emp change age age1 int(4) not null default 0; 在表Column的尾部追加新的column: alter table emp add birth date not null after empno; 移動column到表column的首位: alter table emp modify age1 int(3) not null default 0 first; 將某個column移動到另一個columon后面: alter table department change deptno deptno int(11) NOT NULL after deptname; 刪除主鍵: alter visit_log drop primary key; 修改表名: alter table emp rename employees; 刪除字段 alter table guess_product_info drop column backstyle;
3. DCL(Data Control Language,數據控制語言)
- 設置或更改數據庫用戶或角色權限,包括對基本表和視圖的授權,完整性規則的描述,事務控制等內容。
- grant
賦予權限
grant all privileges on *.* to 'root'@'localhost' with grant option; 授權遠程用戶注意不要with grant option grant select,update,create,delete on *.* to guest@'115.220.46.%' identified by 'test@home';創建業務用戶,並要求只限制IP段 查看權限 Select user,password,host from mysql.user; Show grants for root@'localhost'; select user,password,host ,grant_priv,super_priv from mysql.user; 重命名用戶 rename mysql.user root@' ' to admin@' '; 刷新權限 flush privileges 回收權限 revoke select,insesrt,update,delete,create on *.* from 'guest'@'115.220.46.%'; show grants for guest@'115.220.46.%'; 修改密碼 update mysql.user set password =password('test') where user='guest';password()函數對字符串進行MD5加密 mysqladmin -uroot -ptest password 12345 -p 舊密碼 password 新密碼 忘記密碼 mysqld_safe --defaults-file=/etc/mysql/my3306.cnf --skip-grant-tables & 刪除用戶 drop user root@''; 刪除test數據庫 select * from mysql.db where db like '%test%'\G; delete from mysql.db where db like '%test%'; 刪除不需要的用戶 mysql> select user,password,host from mysql.user; +------+-------------------------------------------+------------+ | user | password | host | +------+-------------------------------------------+------------+ | root | | localhost | | root | | nbview.com | | root | | 127.0.0.1 | | root | | ::1 | | | | localhost | | | | nbview.com | | kewy | kewy126@home | % | | root | *08F411191A8F7130F09F0A961DB8E87983620D5B | % | +------+-------------------------------------------+------------+ 8 rows in set (0.00 sec) mysql> delete from mysql.user where user='kewy'; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 59 Current database: student_db1 Query OK, 1 row affected (0.01 sec) mysql> delete from mysql.user where user='root' and host='::1'; Query OK, 1 row affected (0.00 sec) mysql> delete from mysql.user where user='root' and host='nbview.com'; Query OK, 1 row affected (0.00 sec) mysql> delete from mysql.user where host='nbview.com'; Query OK, 1 row affected (0.00 sec) mysql> delete from mysql.user where host='localhost' and user is null; Query OK, 0 rows affected (0.00 sec) mysql> delete from mysql.user where host='127.0.0.1' ; Query OK, 1 row affected (0.00 sec) mysql> select user,password,host from mysql.user; +------+-------------------------------------------+-----------+ | user | password | host | +------+-------------------------------------------+-----------+ | root | | localhost | | root | *08F411191A8F7130F09F0A961DB8E87983620D5B | % | +------+-------------------------------------------+-----------+ 2 rows in set (0.00 sec)
4. TCL(Transaction Control Language,事務控制語言)
- TCL用於控制事務內執行流程的語言
- start transaction|Begin:開始一個事務
- Savepoint:創建一個記錄點,方便回滾到這個地方
- Rollback:回滾事務
- Commit:提交事務
開始事務
START TRANSACTION
可選:創建一個存檔點
SAVEPOINT sp
開始操作SQL
select
insert
...
操作完成提交數據
COMMIT
或者,操作失敗,回滾數據(回滾到某個存檔點)
ROLLBACK
ROLLBACK TO sp
釋放存檔點
RELEASE SAVEPOINT sp
總結
在進行數據庫物理設計時,我們需要計算每張表的存儲空間, 選擇存儲引擎和表中的數據類型。
歡迎關注微信公眾號:木可大大,所有文章都將同步在公眾號上。
