1. 程式人生 > >數據庫基礎常用知識

數據庫基礎常用知識

常用 查詢 mysql 索引 class 原子 排序 使用 很多 遷移數據

一,關系數據庫三大範式

第一範式要求每一列都不可再分,即要滿足原子性,這也是關系數據庫設計中最基本都要求。第二範式是在它基礎上要求所有非主鍵列都要完全依賴主鍵列,而不能只依賴部分主鍵列(若有此情況,應該拆分表)。第三範式是在第二範式基礎上要求所有非主鍵列都必須要直接依賴主鍵列,而不是依賴某非主鍵列進而間接依賴主鍵列,比如用戶表有用戶id、用戶名、組織id、組織名稱字段時就不滿足第三範式,因為組織名稱是直接依賴組織id的。不過實際在關系數據庫表設計時為了減少關聯表查詢都會采用這種冗余設計。

二、數據庫表連間的連接關系

常見的數據庫表間連接關系分為內連接、外連接、左(右)外連接、交叉連接幾種。其中內連接返回兩個表中滿足條件的記錄,外連接(全外連接)返回兩個表中所有記錄(包括滿足條件的記錄,其它左邊表記錄+右邊表字段為空,其它右邊表記錄+左邊表字段為空),左外連接以左邊表為準,返回所有左邊表記錄(右邊表不存在關聯記錄的返回空),交叉連接是返回兩邊記錄的乘積。

三、數據庫索引概念及註意事項

數據庫索引目的是為了增加記錄的查詢排序效率,避免全表掃描提升效率,尤其是在表數據多情況下,正確使用索引能極大提高數據庫的查詢效率。通常數據庫索引使用B+樹結構,其它類似常用的索引結構有Hash索引、LSM樹索引。

從記錄順序與物理磁盤順序是否一致的角度看索引分為聚簇索引和非聚簇索引。聚簇索引是指索引記錄順序與物理記錄順序一致,查詢效率更高,更適用於區間記錄查詢,每個表只能建一個聚簇索引,默認在建表主鍵時會把它設置為聚簇索引(如果要設置其它列為聚簇索引,要在指定主鍵前設置)。

常見索引分類有普通索引(常見的索引)、唯一索引(列值唯一的索引,允許空值)、主鍵索引(特殊的唯一索引)、單例索引、聯合索引。使用索引有以下註意事項:

  1. 避免過度使用索引,如果表記錄不多,或者是重復記錄很多(比如性別列),或者表的增、改、刪很頻繁,不建議使用索引,因為索引效果不明顯還增加了維護成本。
  2. 合理使用索引,尤其是聯合索引,應將區分記錄更多、查詢條件在前的列放在聯合索引的前面,避免像MySQL數據庫左聯合索引規則(假設聯合索引列為a、b、c時如果條件中沒有a列則不起作用,PgSql似乎沒這個問題)。
  3. 任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。
  4. in、or子句常會使用工作表,使索引失效;如果不產生大量重復值,可以考慮把子句拆開;拆開的子句中應該包含索引。

哪些情況需要建索引:

1 主鍵,唯一索引
2 經常用作查詢條件的字段需要創建索引
3 經常需要排序、分組和統計的字段需要建立索引
4 查詢中與其他表關聯的字段,外鍵關系建立索引

哪些情況不要建索引:
1 表的記錄太少,百萬級以下的數據不需要創建索引
2 經常增刪改的表不需要創建索引
3 數據重復且分布平均的字段不需要創建索引,如 true,false 之類。
4 頻發更新的字段不適合創建索引
5 where條件裏用不到的字段不需要創建索引

索引的一些總結

Mysql 索引優化分析

四、關系數據庫表中不應存的三類值

  1. 大文件、聲音圖片文件,雖然數據庫字段有blog類型,但最後還是不要直接將文件存入數據庫,而是通過存入對應文件路徑解決。因為通過數據庫操作速度不如直接操作文件快,會增大數據庫文件備份遷移數據麻煩。有網友表示在MySQL數據庫中存儲圖片文件列,雖然在查詢中不含該字段也會拖慢查詢效率。
  2. 臨時數據,比如session、每小時、天會過期清理的數據不應該存在數據庫中,存在Redis之類的緩存中更合適。
  3. 大量日誌文件,如果想將日誌存入數據庫以方便日誌的查詢最好也是單獨建立日誌庫,避免因為頻繁寫入日誌而影響主業務表的訪問效率。

數據庫基礎常用知識