一、資料庫正規化
為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。
1.1、第一正規化(1nf:每一列不可包含多個值)
所謂第一正規化(1nf)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1nf)中表的每一行只包含乙個例項的資訊。
在任何乙個關聯式資料庫中,第一正規化(1nf)是對關係模式的基本要求,不滿足第一正規化(1nf)的資料庫就不是關聯式資料庫。
1.2、第二正規化(2nf:非主屬性部分依賴於主關鍵字)
第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被唯一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的唯一標識。
第二正規化(2nf)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上乙個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是非主屬性部分依賴於主關鍵字。
1.3、第三正規化(3nf:屬性不依賴於其它非主屬性)
滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在乙個部門資訊表,其中每個部門有部門編號、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。
1.4、反三正規化(反3nf:為了效能,增加冗餘)
3nf提出目的是為了降低冗餘,減少不必要的儲存,這對於儲存裝置昂貴的過去是很有必要的,但是隨著儲存裝置的降價以及人們對效能的不斷提高,又有人提出反三正規化。
所謂反三正規化就是為了效能,增加冗餘。以部門資訊表為例,每個部門有部門編號、部門名稱、部門簡介等資訊,按照3nf的要求,為了避免冗餘,我們在員工表中就不應該加入部門名稱、部門簡介等部門有關資訊,帶來的代價是每次都要查詢兩次資料庫。反三正規化允許我們冗餘重要資訊到員工表中,例如部門名稱,這樣我們每次取員工資訊時就能直接取出部門名稱,不需要查詢兩次資料庫,提公升了程式效能。
二、mysql優化整體思路
mysql優化首先應該定位問題,可能導致mysql低效能的原因有:業務邏輯過多的查詢、表結構不合理、
sql語句優化以及硬體優化,從優化效果來看,這四個優化點的優化效果依次降低:理清業務邏輯能夠幫助我們避免不必要的查詢,合理設計表結構也能幫助我們少查詢資料庫。對於sql語句優化,我們可以先使用慢查詢日誌定位慢查詢,然後針對該查詢進行優化,最常見且最有效的優化正規化就是增加合理的索引,這個在上篇部落格已經講解,本篇部落格將講解其他一些優化手段或者注意點。
2.1、謹慎使用text/blob型別
當列型別是text或者blob時,我們應該特別注意,因為當選擇的字段有 text/blob 型別的時候,無法建立記憶體表,只能建立硬碟臨時表,而硬碟臨時表的效能比記憶體表的效能差,所以如果非要使用text/blob型別,應該單獨建表,不要把text/blob型別與核心屬性混合在一張表中。對此,做乙個實驗如下:
//建立資料表
create table t1 (
num int,
intro text(1000)
);
//插入資料
insert into t1 values (3,'this is usa') , (4,'china');
//查詢臨時表建立情況
//注意,這裡created_tmp_disk_tables=4,created_tmp_tables=10
mysql> show status like '%tmp%';
+-------------------------+-------+
| variable_name | value |
+-------------------------+-------+
| created_tmp_disk_tables | 4 |
| created_tmp_files | 9 |
| created_tmp_tables | 10 |
+-------------------------+-------+
//使用group by查詢資料
mysql> select * from t1 group by num;
+------+-------------+
| num | intro |
+------+-------------+
| 3 | this is usa |
| 4 | china |
+------+-------------+
2 rows in set (0.05 sec)
//再次查詢臨時表建立情況
//現在,created_tmp_disk_tables=5,created_tmp_tables=11
mysql> show status like '%tmp%';
+-------------------------+-------+
| variable_name | value |
+-------------------------+-------+
| created_tmp_disk_tables | 5 |
| created_tmp_files | 9 |
| created_tmp_tables | 11 |
+-------------------------+-------+
MySQL 資料庫設計正規化 優化
設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf 第四正規化 4nf 和第五正規化 5nf,又稱完美正規化 各種正規化呈遞次規範...
資料庫三正規化及部分優化
如何通俗地理解三個正規化?答 第一正規化 1nf是對屬性的原子性約束,要求屬性具有原子性,不可再分解 第二正規化 2nf是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性 第三正規化 3nf是對字段冗餘性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗餘。正規化化設計優缺點 優點 可...
Mysql效能優化,三正規化,資料庫優化方案
1.資料庫設計 2.sql語句優化 3.資料庫引數配置 4.恰當的硬體資源和作業系統 此外,使用適當的儲存過程,也能提公升效能。這個順序也表現了這四個工作對效能影響的大小 1.explain關鍵字作用2 explain使用舉例 explain select from emp where ename ...