資料庫優化的學習記錄

2022-09-10 14:21:21 字數 2408 閱讀 6556

一些基於自己理解和知識的資料庫優化的方**,主要是他人的建議和網上搜尋總結的資料,從個人筆記轉移到部落格上 :)

資料庫優化

sql語句及索引的優化

對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。

應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄

應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄。

應盡量避免在 where 子句中使用 or 來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄

in 和 not in 也要慎用,否則會導致全表掃瞄,對於連續的數值,能用 between 就不要用 in 了,很多時候用 exists 代替 in 是乙個好的選擇

使用 like 『%abc%』 也將導致全表掃瞄

應盡量避免在where子句中對字段進行 函式操作 或者 表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄

不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。

在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

不要寫一些沒有意義的查詢,如需要生成乙個空表結構: select col1,col2 into #t from t where 1=0 這類**不會返回任何結果集,但是會消耗系統資源的,應改成這樣: create table #t(…)

update 語句,如果只更改1、2個字段,不要update全部字段,否則頻繁呼叫會引起明顯的效能消耗,同時帶來大量日誌。

對於多張大資料量(這裡幾百條就算大了)的表join,要先分頁再join,否則邏輯讀會很高,效能很差。

select count(*) from table;這樣不帶任何條件的count會引起全表掃瞄,並且沒有任何業務意義,是一定要杜絕的。

索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個

應盡可能的避免更新 clustered 索引資料列,因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。

盡量使用數字型字段,若只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連 接時會逐個比較字串中每乙個字元,而對於數字型而言只需要比較一次就夠了。

盡可能的使用 varchar/nvarchar 代替 char/nchar,因為首先變長字段儲存空間小,可以節省儲存空間,其次對於查詢來說,在乙個相對較小的字段內搜尋效率顯然要高些。

任何地方都不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何字段。

盡量使用表變數來代替臨時表。如果表變數包含大量資料,請注意索引非常有限((只有主鍵索引)。

如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。

盡量避免使用游標,因為游標的效率較差,如果游標操作的資料超過1萬行,那麼就應該考慮改寫。

使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。

與臨時表一樣,游標並不是不可使用。對小型資料集使用 fast_forward 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括「合計」的例程通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

資料庫表結構的優化

適當拆分

適度冗餘

盡量使用 not null

硬體/架構,系統配置 優化主從複製與讀寫分離

增加快取

分割槽分庫

分表資料庫維護,包括效能監控、效能分析、效能調優、資料庫備份和恢復等

開啟慢查詢日誌

innodb和myisam區別

儲存結構

儲存空間

可移植性、備份及恢復

事務支援

auto_increment

表鎖差異

全文索引

表主鍵innodb:如果沒有設定主鍵或者非空唯一索引,就會自動生成乙個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引儲存的是主索引的值的資料列。

表的具體行數

curd操作

外來鍵

資料庫學習記錄

基本概念 主鍵有2種主鍵的存在。一種是業務主鍵,一種是邏輯主鍵 業務主鍵通常是表裡有的資料作為主鍵使用。一般常見的就是不容易重複的資料,例如 身份證號等 邏輯主鍵就是本來一條資料沒有這個字段,但是我們擔心會出現重複資料,我們自己生成乙個讓此條資料成為唯一的重要字段,在一張表裡很明顯的主鍵建立方式是乙...

資料庫點滴學習記錄

此部落格記錄資料庫所遇見的錯誤,之後慢慢新增 ora 00907 缺失右括號問題 1 union all中order by 導致缺失右括號 錯誤例子 select from select column a,column b from table example a order by column a...

資料庫(MySQL)學習記錄

業務需要,從零學習資料庫。持續更新中 資料庫 資料庫是一些關聯表的集合。資料表 表是資料的矩陣。在乙個資料庫中的表看起來像乙個簡單的電子 冗餘 儲存兩倍資料,冗餘降低了效能,但提高了資料的安全性。主鍵 主鍵是唯一的。乙個資料表中只能包含乙個主鍵。你可以使用主鍵來查詢資料。外來鍵 外來鍵用於關聯兩個表...