1. 程式人生 > >資料庫:設計、優化和備份

資料庫:設計、優化和備份

目錄

一、資料庫設計

1.為什麼需要資料庫設計?

2.資料庫設計的3大正規化

3.資料庫設計的步驟

4.E-R圖也稱實體-關係圖(Entity Relationship Diagram)

5.實體之間的關係

二、資料庫優化

1.select 字句中避免使用(*)

2.索引失效的情況

3.用UNION替換OR(使用於索引列)

4.用exists替代in、用not exists替代not in

三、備份和還原


一、資料庫設計

1.為什麼需要資料庫設計?

俗話說有好的設計,才有好的優化,資料庫作為資訊系統的核心,其設計自然是重中之重。

2.資料庫設計的3大正規化

1NF:

  • 所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合、陣列、記錄等非原子資料項。

2NF:

  • 第二正規化是在第一正規化基礎上更進一層。
  • 第二正規化要確保資料庫表中的每一列都和主鍵相關,而不能至於主鍵的某一部分相關(主要針對聯合主鍵而言)。
  • 也就是說在一個數據庫表中,一個表只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

3NF:

  • 第三正規化要求每列都和主鍵直接相關而不是間接相關。

3.資料庫設計的步驟

需求分析階段

  • 準確瞭解和分析使用者需求(包括資料與處理)。
  • 是整個設計過程的基礎,是最困難、最耗時的一步。

概念結構設計階段

  • 是整個資料庫設計的關鍵。
  • 設計資料庫的E-R模型圖,確認需求資訊的正確和完整。

邏輯設計階段

  • 將E-R圖轉換為邏輯模型(邏輯模型為關係模型則體現為多張表)
  • 應用資料庫設計的3大正規化進行稽核
  • 設計外模式,建立檢視

物理設計階段

  • 確定存取方法(例如索引的設定)
  • 確定儲存結構(檔案存放的位置等),並編寫程式碼實現前端應用

資料庫實施階段

  • 將資料載入,並對資料庫進行測試。

執行和維護階段

  • 使用和維護資料庫

4.E-R圖也稱實體-關係圖(Entity Relationship Diagram)

提供了表示實體型別、屬性和關係的方法,是用來描述現實世界的概念模型。

在E-R圖中有以下4個成分:

  • 矩形框:表示實體,在框中記錄實體名
  • 菱形框:表示關係,在框中記錄關係名
  • 橢圓形框:表示實體或關係的屬性,將屬性名記入框中。對於主屬性名,則在其名稱下劃線。
  • 連線:實體與屬性之間;實體與關係之間;關係與屬性之間用直線連線,並在直線上標註關係的類性。(對於一對一關係,要在兩個實體連線方向各寫1;對於一對多關係,要在一的一方寫1,多的一方寫N;對於多對多關係,要在兩個實體連線方向各寫N,M。)
  • 如下圖:

5.實體之間的關係

一對一:個人資訊和檔案資訊

  • 外來鍵新增唯一約束
  • 讓主鍵做外來鍵

一對多:僱員和部門

  • 主鍵作為外來鍵,外來鍵設定在多的一方。

多對多:學生和課程

  • 建立關係表
  • 關係表建立聯合主鍵

 

二、資料庫優化

1.select 字句中避免使用(*)

比如oracle在解析過程中,會將(*)依次轉換成所有的列名,這個工作通過查詢資料字典完成的,這意味著將耗費更多的時間。

2.索引失效的情況

  • 索引列使用 not  / != / <> / > / < / not null / null:如果某列建立索引,當進行select * from emp where deptno is not null / is null,則索引會失效。
  • 索引列上不要使用函式,如下均會失效
    • select col from tbl where substr(name,1,3)='abc';
    • select col from tbl where name like '%abc%';
    • select col from tbl where name like 'abc%';#這個索引會生效
  • 索引列上不能進行計算

3.用UNION替換OR(使用於索引列)

通過情況下用UNION替換where字句中的or將會起到較好的效果,對索引列使用or將造成全表掃描。注意,這個規則只針對多個索引列有效。如果有列沒有被索引,查詢效率可能會因為你沒有使用or而降低。

4.用exists替代in、用not exists替代not in

在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行連線,在這種情況下,使用exists(或not exists)通常將提高查詢的效率。

在子查詢中,not in字句將執行一個內部的排序和合並,無論在哪種情況下,not in 都是最低效的(因為它對子查詢中的表執行了一個全表遍歷)。為了避免使用not in,我們可以把它改外連線或not exits。

高效:select * from emp where exists (select 'x' from dept where dept.deptno = emp.deptno and loc='melb');

低效:select * from emp where deptno in (select deptno from dept where loc='melb');

三、備份和還原

備份命令:mysqldump -uroot -proot dbname > d:/t.sql

還原命令:mysql -uroot -p < d:/t.sql