資料庫優化

2021-09-26 16:24:09 字數 2384 閱讀 2664

2 sql 優化

1.使用快取:比如redis

2.合理使用索引:如頻繁作為查詢條件的字段,查詢中有排序,統計,分組的字段我們都應建立索引,但經常更新的表就不適合建立索引,因為索引固然可以提高查詢效率,但同時會影響插入、更新、刪除的效率,因為會設計到重建索引的問題。

3.合理的資料庫設計:

(1)根據資料庫三正規化來進行表結構的設計

(2)為每張表設自增id

4.sql語句優化

(1)考慮:

使用preparedment、在where 及orderby 涉及的列上建索引;用exist代替in,加快查詢速度,使用limit1,用enum 型別代替 varchar 型別

(2)避免:

5.選用合適的儲存引擎。

1nf:字段不可分;原子性 字段不可再分,否則就不是關聯式資料庫;

如:某些資料庫系統可能要用到「位址」這個屬性,本來說直接將位址屬性設定成資料庫的乙個欄位就行,但如果系統會經常訪問位址屬性中省份、城市等資訊,就要將位址重新拆分成 省份、城市 等多個部分分別進行儲存,這樣只對位址中某一部分進行操作就十分方便了。

2nf:在1nf的基礎上,有主鍵,非主鍵字段依賴主鍵; 唯一性,乙個表只說明乙個事物;

如:在選課關係表(學號,課程號,成績,學分),關鍵字為組合關鍵字(學號,課程號),但由於非主屬性學分僅依賴於課程號,對關鍵字(學號,課程號)只是部分依賴,而不是完全依賴,因此此種方式會導致資料冗餘以及更新異常等問題,解決辦法是將其分為兩個關係模式:學生表(學號,課程號,分數)和課程表(課程號,學分),新關係通過學生表中的外關鍵字課程號聯絡,在需要時進行連線。

3nf:在2nf的基礎上,非主鍵字段不能相互依賴; 每列都與主鍵有直接關係,不存在傳遞依賴;

如:一張表中包含學號, 姓名, 年齡, 所在學院, 學院聯絡**,關鍵字為單一關鍵字"學號";存在依賴傳遞: (學號) → (所在學院) → (學院地點, 學院**)

存在問題:資料冗餘:有重複值;有重複的冗餘資訊,修改時需要同時修改多條記錄,否則會出現資料不一致的情況這時需要將表拆分:學生表存放 學號, 姓名, 年齡, 所在學院;學院表存放:學院, 地點, ** 。也就是要求每列都與主鍵有直接關係

每張表設定乙個 id?

因為資料庫 innodb 的索引底層是 b+樹,他的非葉子結點存的是主鍵。如果沒有主鍵的話,他會使用乙個唯一可以標識這個行的字段作為索引結點,那麼這種情況下,比如有乙個 varchar 型別的 email/tel 可以進行表示,因為varchar 型別的當主鍵會使的效能下降。

為什麼 innodb 中表的主鍵最好要自增?

(1)innodb 使用聚集索引,資料記錄本身被存於主索引(一顆 b+tree)的葉子節點上。這就要求同乙個葉子節點內(大小為乙個記憶體頁或磁碟頁)的 各條資料記錄按主鍵順序存放。

(2)因此每當有一條新的記錄插入時,mysql 會根據其主鍵將其插入適當的節點和位置。如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置, 當一頁寫滿,就會自動開闢乙個新的頁。這樣就會形成乙個緊湊的索引結構,近似順序填滿。由於每次插入時也不需要移動已有資料, 因此效率很 高,也不會增加很多開銷在維護索引上。

(3)如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此 時 mysql 不得不為了將新記錄插到合適位置而移動資料,這增 加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過optimize table 來重建表並優化填充頁面。

注:optimize table 的作用:重新利用被刪除的空間,並整理資料檔案的碎片。原因:當刪除資料的時候,mysql 並不會**;而是等待新的資料去填補這個空缺。所以對於寫比較頻繁的表,需要定期進行 optimize table 的操作。

parparestatement 的優勢:

a. 他可以寫動態引數化的查詢,執行更高效。通過相同的 sql 和不同的引數來做查詢比建立乙個不同的 sql 查詢要更高效一些。

b. sql 語句會預編譯在資料庫系統中,使用預處理語句比普通的查詢更快。執行計畫同樣會被快取起來,它允許資料庫做引數化查詢。使用預處理語句比普通的查詢更快,因為它做的工作更少

c. preparedstatement 可以防止 sql 注入式攻擊。在使用引數化查詢的情況下,資料庫系統不會將引數的內容視為 sql 指令的一部分來處理,而是在資料庫完成 sql 指令的編譯後,才套用引數執行,因此就算引數中含有破壞性的指令,也不會被資料庫所執行。

資料庫優化 資料庫設計優化

一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...

資料庫引擎優化顧問優化資料庫

現在一直在做的專案,資料量相對也不小,開始的時候沒有覺得,因為是剛開始,資料量還很小,在程式使用過程中速度還挺快,但是隨著資料量的不停的增長,發現程式越來越慢,甚至出現了超時的問題,因此要對程式和資料庫進行優化,前期專案比較緊,沒有針對大資料量業務進行分析設計,所以索引等相關優化沒有做到位,通過後期...

資料庫優化

資料庫優化 1 合理使用索引 索引是資料庫中重要的資料結構,它的根本目的就是提高查詢效率。索引的使用要恰到好處,其使用原則如下 在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的字段則由優化器自動生成索引 在頻繁進行排序或分組 即進行groupby或orderby操作 的列上建立索引...