面試題 資料庫優化的方法

2021-09-27 03:38:50 字數 2233 閱讀 8422

話不多說,先上結論

一、表的設計合理化,符合三大正規化(3nf)

二、新增適當索引(index) [四種: 普通索引、主鍵索引、唯一索引unique、全文索引]

三、查詢語句的優化

四、資料庫的分庫分表

五、使用儲存過程(模組化程式設計,可以提高速度)

六、資料庫硬體公升級

七、使用快取機制

資料庫滿足資料庫的三大正規化可以避免資料冗餘。

簡單來說三句話:

1nf、列不可分;

2nf、非主鍵列完全依賴主鍵,不存在部分依賴;

3nf、非主鍵列必須直接依賴主鍵,不存在傳遞依賴。

第一正規化(1nf):強調的是列的原子性,即列不能夠再分成其他幾列。 

考慮這樣乙個表:【聯絡人】(姓名,性別,**) 

如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到 1nf。要符合 1nf 我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。1nf 很好辨別,但是 2nf 和 3nf 就容易搞混淆。

◆ 第二正規化(2nf):首先是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。 

考慮乙個訂單明細表:【orderdetail】(orderid,productid,unitprice,discount,quantity,productname)。

因為我們知道在乙個訂單中可以訂購多種產品,所以單單乙個 orderid 是不足以成為主鍵的,主鍵應該是(orderid,productid)。顯而易見 discount(折扣),quantity(數量)完全依賴(取決)於主鍵(oderid,productid),而 unitprice,productname 只依賴於 productid。所以 orderdetail 表不符合 2nf。不符合 2nf 的設計容易產生冗餘資料。

可以把【orderdetail】表拆分為【orderdetail】(orderid,productid,discount,quantity)和【product】(productid,unitprice,productname)來消除原訂單表中unitprice,productname多次重複的情況。

◆ 第三正規化(3nf):首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 a 依賴於非主鍵列 b,非主鍵列 b 依賴於主鍵的情況。

考慮乙個訂單表【order】(orderid,orderdate,customerid,customername,customeraddr,customercity)主鍵是(orderid)。

其中 orderdate,customerid,customername,customeraddr,customercity 等非主鍵列都完全依賴於主鍵(orderid),所以符合 2nf。不過問題是 customername,customeraddr,customercity 直接依賴的是 customerid(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3nf。

通過拆分【order】為【order】(orderid,orderdate,customerid)和【customer】(customerid,customername,customeraddr,customercity)從而達到 3nf。

1.應考慮在 where 及 order by 涉及的列上建立索引。

2. 更新非常頻繁的字段不適合建立索引。

3. 索引並不是越多越好。

大多數情況下索引能大幅度提高查詢效率,但:

①資料的變更(增刪改)都需要維護索引,因此更多的索引意味著更多的維護成本

②更多的索引意味著也需要更多的空間 (一本100頁的書,卻有50頁目錄?)

1.避免索引失效導致的全表掃瞄

2.sql語句的規範

設定資料庫主從複製狀態下的讀寫分離,主庫進行更新操作,從庫進行查詢操作。(可以使用中介軟體mycat進行實現)

什麼是儲存過程?

儲存過程是對一些sql語句和控制語句的封裝,客戶端可以通過儲存過程的名稱對其進行呼叫。

儲存過程分類

可以使用redis作為快取,避免所有請求都落在db上。

面試題 資料庫優化

從以下方面去考慮 建立並使用盡量索引,以及避免全表掃瞄 索引是什麼 索引分類 between and 代替in exists 代替in union代替in where子句將過濾大量資料的條件放靠後 避免where子句中使用is not null is null 函式運輸 算術運算 等判斷 2 程式語...

PHP經典面試題 資料庫優化

mysql資料庫優化 php學習過程中或者面試過程中少不了的乙個重要知識點,那就是關於資料庫的優化問題,本人經過查閱資料並驗證,總結了幾點比較淺層的資料庫優化方法,小白可以參考,大神勿噴。忘了什麼時候發現的一張關於mysql資料庫優化的梯形圖了,一直收藏著,感覺很有道理 從圖中可以很明顯的看出mys...

面試題 資料庫

今天面試,遇到資料庫方面的問題,由於好久沒接觸過,很多都忘記了,回來查了資料,整理一下 1 觸發器與儲存過程的區別 觸發器 是一種特殊型別的儲存過程,當使用下面的一種或多種資料修改操作在指定表中對資料進行修改時,觸發器會生效 update insert 或 delete。觸發器可以查詢其它表,而且可...