資料庫的優化,結構 優化

2021-10-05 08:42:37 字數 2730 閱讀 7183

避免**頁面出現訪問錯誤

1.由於資料庫練級timeout產生頁面5xx錯誤

2.由於慢查詢造成頁面無法載入

6.由於阻塞造成資料無法提交

增加資料庫的穩定性

1.很多資料庫問題都是由於低效的查詢引起的
優化使用者的體驗

1.流暢頁面的訪問速度

2.良好的**功能體驗

mysql可以很好的支援大資料量的訪問,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在建立表的時候,為了獲得更好的效能,我們可以將表中字段的寬度設得盡可能小。另外乙個提高效率的方法是在可能的情況下,應該盡量把字段設定為notnull,這樣在將來執行查詢的時候,資料庫不用去比較null值。

mysql從4.1開始支援sql的子查詢。這個技術可以使用select語句來建立乙個單列的查詢結果,然後把這個結果作為過濾條件用在另乙個查詢中。例如,我們要將客戶基本資訊表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售資訊表中將所有發出訂單的客戶id取出來,然後將結果傳遞給主查詢,如下所示:

delete from customerinfo

where customerid not in (select customerid from salesinfo)

使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的sql操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連線(join)…替代。例如,假設我們要將所有沒有訂單記錄的使用者取出來,可以用下面這個查詢完成:

select * from customerinfo

where customerid not in (selectc ustomerid from salesinfo)

如果使用連線(join)…來完成這個查詢工作,速度將會快很多。尤其是當salesinfo表中對customerid建有索引的話,效能將會更好,查詢如下:

select * from customerinfo

left join salesinfo on customerinfo.customerid=salesinfo.customerid

where salesinfo.customerid isnull

連線(join)…之所以更有效率一些,是因為mysql不需要在記憶體中建立臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

mysql從4.0的版本開始支援union查詢,它可以把需要使用臨時表的兩條或更多的select查詢合併的乙個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效。使用union來建立查詢的時候,我們只需要用union作為關鍵字把多個select語句連線起來就可以了,要注意的是所有select語句中的字段數目要想同。

鎖定表的方法可以維護資料的完整性,但是他卻不能保證資料的關聯性。這個時候我們就可以使用外來鍵。

索引是提高資料庫效能的常用方法,他可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行。一般來說,索引應該建立在那些將用於json,where判斷和orderby排序的字段上。盡量不要對資料庫中某個含有大量重複的值得字段建立索引。對於乙個enum型別的字段來說,出現大量重複 是很有可能的情況。

絕大多數情況下,使用索引可以提高查詢的速度,但是如果sql語句使用不恰當的話,索引將無法發揮它應有的作用。

根據資料庫三正規化來進行表結構的設計。設計表結構時,就需要考慮如何設計才能更有效的查詢。
第一正規化:資料表中每個欄位都必須是不可拆分的最小單元,也就是確保每一列的原子性; 

第二正規化:滿足一正規化後,表中每一列必須有唯一性,都必須依賴於主鍵;

第三正規化:滿足二正規化後,表中的每一列只與主鍵直接相關而不是間接相關(外來鍵也是直接相關),字段沒有冗餘。

注意:沒有最好的設計,只有最合適的設計,所以不要過分注重理論。三正規化可以作為乙個基本依據,不要生搬硬套。

有時候可以根據場景合理地反規範化:

a:分割表。

b:保留冗餘字段。當兩個或多個表在查詢中經常需要連線時,可以在其中乙個表上增加若干冗餘的字段,以

避免表之間的連線過於頻繁,一般在冗餘列的資料不經常變動的情況下使用。

c:增加派生列。派生列是由表中的其它多個列的計算所得,增加派生列可以減少統計運算,在資料彙總時可以大大縮短運算時間。

資料庫五大約束:

a:primary key:設定主鍵約束;

b:unique:設定唯一性約束,不能有重複值;

c:default 預設值約束

d:not null:設定非空約束,該欄位不能為空;

e:foreign key :設定外來鍵約束。

字段型別選擇:

a:盡量使用tinyint、smallint、medium_int作為整數型別而非int,如果非負則加上unsigned

b:varchar的長度只分配真正需要的空間

c:使用列舉或整數代替字串型別

d:盡量使用timestamp而非datetime

e:單錶不要有太多字段,建議在20以內

f:避免使用null欄位,很難查詢優化且占用額外索引空間

資料庫結構優化

一 資料庫結構優化的目的 1.減少資料冗餘。2.勁量避免資料維護中出現更新,插入和刪除異常 插入異常 如果表中的某個實體隨著另乙個實體而存在 單獨插入某個字段失敗,因為有的字段不能為空 更新異常 如果更改表中的某個實體的單獨屬性時,需要對多行進行更新。刪除異常 如果刪除表中的某乙個實體則會導致其他實...

資料庫結構優化

資料庫結構優化 優化表結構 1 盡量將表字段定義為not null約束,因為mysql中含空值得列很難查詢優化 2 對於只包含特定型別的字段,可以使用enum,set等 3 數值型字段的比較比字串比較效率高很多,字段型別盡量使用最小,最簡單型別 4 盡量使用tinyint,smallint,medi...

資料庫結構優化

資料庫結構優化的目的是為了 減少資料冗餘 盡量避免資料維護 現更新,插入和刪除異常.節約資料儲存空間 提高查詢效率 資料庫設計正規化 第一正規化 資料庫表中的所有欄位都自由單一屬性 單一屬性的列是由基本的資料型別鎖構成的 設計出來的表都是簡單的二維表 綜上 幾乎只要能在當今資料庫中建立起來的表都是第...