MySQL 資料庫設計正規化 優化

2021-10-01 13:06:13 字數 2600 閱讀 5588

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化。

目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。

各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。但是正規化越高也意味著表的劃分更細,乙個資料庫中需要的表也就越多,此時多個表聯接在一起的花費是巨大的,尤其是當需要連線的兩張或者多張表資料非常龐大的時候,表連線操作幾乎是乙個噩夢,這嚴重地降低了系統執行效能所以通常資料庫設計遵循第一第二第三正規化,以避免資料操作異常,又不至於表關係過於複雜。

正規化簡介:

定義

mysql資料庫管理系統中用來處理表的處理器
基本操作

1、檢視所有儲存引擎

mysql> show engines;

2、檢視已有表的儲存引擎

mysql> show create table 表名;

3、建立表指定

create table 表名(...)engine=myisam,charset=utf8,auto_increment=10000;

4、已有表指定

alter table 表名 engine=innodb;

常用儲存引擎特點

1、支援**行級鎖**,僅對指定的記錄進行加鎖,這樣其它程序還是可以對同乙個表中的其它記錄進行操作。

2、支援外來鍵、事務、事務回滾

3、表字段和索引同儲存在乙個檔案中

1、表名.frm :表結構

2、表名.ibd : 表記錄及索引檔案

1、支援**表級鎖**,在鎖定期間,其它程序無法對該錶進行寫操作。如果你是寫鎖,則其它程序則讀也不允許

2、表字段和索引分開儲存

1、表名.frm :表結構

2、表名.myi : 索引檔案(my index)

3、表名.myd : 表記錄(my data)

如何選擇儲存引擎

1、執行**查**操作多的錶用 myisam(使用innodb浪費資源)

2、執行**寫**操作多的錶用 innodb

create table tb_stu(

`id` int(11) not null auto_increment,

`name` varchar(30) default null,

`***` varchar(2) default null,

primary key (`id`)

)engine=myisam default charset=utf8;

字串在查詢時比排序時資料處理慢

占用空間少,資料庫佔磁碟頁少,io處理就更快

使用 explain 關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。這可以幫你分析你的查詢語句或是表結構的效能瓶頸。通過explain命令可以得到:

explain

select

*from class_1 where id <

5;

explain主要字段解析:

type中包含的值:

- system、const: 可以將查詢的變數轉為常量. 如id=1; id為 主鍵或唯一鍵.

- eq_ref: 訪問索引,返回某單一行的資料.(通常在聯接時出現,查詢使用的索引為主鍵或唯一鍵)

- ref: 訪問索引,返回某個值的資料.(可以返回多行) 通常使用=時發生

- range: 這個連線型別使用索引返回乙個範圍中的行,比如使用》或《查詢東西,並且該字段上建有索引時發生的情況

- index: 以索引的順序進行全表掃瞄,優點是不用排序,缺點是還要全表掃瞄

- all: 全表掃瞄,應該盡量避免

盡量避免 or 連線條件,否則會放棄索引進行全表掃瞄,可以用union代替

優化前:select id from t1 where id=10 or id=20;

優化後: select id from t1 where id=10 union all

select id from t1 where id=20;

盡量避免使用 in 和 not in,否則會全表掃瞄

優化前:select id from t1 where id in(1,2,3,4);

優化後:select id from t1 where id between 1 and 4;

垂直拆分 : 表中列太多,分為多個表,每個表是其中的幾個列。將常查詢的放到一起,blob或者text型別字段放到另乙個表

水平拆分 : 減少每個表的資料量,通過hash key進行劃分然後拆成多個表

MySQL 資料庫設計正規化

第一正規化是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值,或不能有重複的屬性。第二正規化是在第一正規化的基礎上建立起來的,滿足第二正規化必須先滿足第一正規化。第二正規化要求實體的屬性完全依賴與主鍵,不能僅依賴主鍵的一部分。即非主鍵欄位需完全依賴與主...

mysql資料庫設計正規化與反設計正規化操作思考

資料庫結構優化的目的 減少資料冗餘,盡量避免資料維護中出現更新 插入和刪除異常,節約資料儲存空間。資料庫設計正規化 第一正規化 1 資料表中的所有欄位都只具有單一屬性 2 單一屬性的列是由基本的資料型別所構成的 3 設計出來的表都應該是簡單的二維表 第二正規化 1 要求乙個表中具有乙個業務主鍵,也就...

資料庫設計正規化

目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 第四正規化 4nf 第五正規化 5nf 和第六正規化 6nf 滿足最低要求的正規化是第一正規化 1nf 在第一正規化的基礎上進一步滿足更多要求的稱為第二正規化 2nf 其餘正規化以次類推。一般說來,資料庫只需滿...