設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化。
目前關聯式資料庫有六種正規化:第一正規化(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 其餘正規化以次類推。一般說來,資料庫只需滿...