數據庫基礎知識

數據庫相關知識

  1. 事務是邏輯上的一組操作,要麼都執行,要麼都不執行

  2. 事務的四大特性

    • 原子性:事務時最小的執行單位,不允許分隔。
    • 一致性:執行事務前後,數據保持一致,多個事務對同一數據讀取的結果 是相同的
    • 隔離性:併發訪問數據庫時,一個用戶的事務不被其他事務所幹擾,各併發事務之間數據庫是獨立的
    • 持久性:一個事務被提交之後。它對數據庫中數據的改變是持久的,即使數據庫發生故障也不應該對其有任何影響。
  3. 併發事務問題:

    • 髒讀:後者對還未同步到數據庫中的數據再次修改
    • 丟失修改:兩者同時修改
    • 不可重複讀:一個事務兩次讀之間有事務對其數據進行了修改
    • 幻讀:類似於不可重複讀(修改)幻讀重點是增加刪除
  4. sql四個隔離級別:

    隔離級別 髒讀 不可重複讀 幻讀
    READ-UNCOMMITTED(讀取未提交)
    READ-COMMITTED(讀取已提交) ×
    REPEATABLE-READ(可重複讀) × ×
    SERIALIZABLE(可串行化) × × ×
  5. 索引

    • 優點:
      • 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性
      • 可以大大加快檢索速度
      • 幫助服務器避免排序和臨時表
      • 將隨機IO變成順序IO
      • 加速表與表之間的連接
  • 缺點:
    • 當進行增刪修的時候索引也需要動態維護,降低了維護速度
      • 需要佔用物理空間
      • 創建索引和維護索引需要時間
    • 通過將無序數據變成有序數據,來加快查詢速度
  • 注意事項:
    • 避免where子句對字段施加函數,會造成無法命中索引
      • 在使用InnoDB時使用與業務無關的自增主鍵作爲左鍵,即使用邏輯主鍵而不要更用業務主鍵
    • 將打算加索引的列設置爲NOT NULL,否則將導致引擎放棄使用索引
      • 刪除長期未使用的索引
      • 在使用limit offset查詢緩慢時,可以使用藉助索引提交性能
    • 聚集(主鍵)和非聚集(非主鍵)索引
    • 區別聚合索引在葉子節點存儲的是表中的數據,非聚合索引在葉子節點存儲的是主鍵和索引列,所以非聚合索引也叫做二級索引。
    • 索引最左匹配原則(MySQL會質疑向右匹配知道遇到範圍查詢)
    • 索引可以簡單如一個列,也可以複雜如多個列,即聯合索引
      • 如果是聯合索引,內碼key也由多個列組成,同時索引也只能用於查找key是否存在、
    • 因此列的排列順序決定了可命中索引的列數
    • 使用保留字UNION可以使索引值在基本表中唯一
    • 覆蓋索引:就是包含了所有查詢字段 (where,select,ordery by,group by 包含的字段) 的索引
      • 好處:避免Innodb表進行索引的二次查詢;可以把隨機IO變成順序IO加快查詢效率
  1. :處理解決併發問題

    • 分類
      • 從數據庫:排它鎖(X鎖),共享鎖(S,讀鎖),更新鎖(U)
      • 從程序員:悲觀鎖,樂觀鎖
    • InnpDB支持行鎖和表鎖,而MyISAM只支持表鎖
    • 判斷死鎖
      • 超時法
      • 等待圖法:出現迴路
    • 減少死鎖
      • 以固定的順序訪問表和行
      • 大事務拆小
      • 降低隔離級別
      • 爲表添加合理的索引
    • 樂觀鎖和悲觀鎖
      • 樂觀鎖:認爲不會鎖定的情況下去更新數據,如果發現不對勁,纔不更新(回滾)。在數據庫中往往添加一個version字段來實現。適用於多讀的應用類型,提高吞吐量
      • 悲觀鎖:用的就是數據庫的行鎖,認爲數據庫會發生併發衝突,直接上來就把數據鎖住,其他事務不能修改,直至提交了當前事務
  2. 大表優化

    • 限定數據的範圍
    • 讀寫分離,主庫負責寫,從庫負責讀
    • 垂直分區:根據數據庫裏面數據表的相關性進行拆分,分列
      • 優點:列數據變小,在查詢是減少讀取的Block數,減少I/O次數,還可以簡化表的結構,易於維護
      • 缺點:主鍵出現冗餘,需要管理冗餘列,並會引起Join操作,可以通過在應用層進行Join來解決。此外,垂直分區會讓事務變得更加複雜
    • 水平分區:保持數據結構不變,通過某種策略存儲數據分片。水平拆分可以支持很大的數據量
  3. MySQL主要Server 層和引擎層:

    • Server 層主要包括連接器、查詢緩存、分析器、優化器、執行器,同時還有一個日誌模塊(binlog),這個日誌模塊所有執行引擎都可以共用,redolog 只有 InnoDB 有。
    • 引擎層是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。
  4. SQL 等執行過程分爲兩類

    • 一類對於查詢等過程如下:權限校驗—查詢緩存—分析器—優化器—權限校驗—執行器—引擎
    • 對於更新等語句執行流程如下:分析器----權限校驗----執行器—擎---redo log prepare—binlog—redo log commit
  5. 數據庫模型:

    • 層級模型
    • 網狀模型
    • 關係模型
  6. 對於主鍵來說基本原則就是:不使用任何業務相關的字段作爲主鍵。(身份證,手機號)

  7. 另外還有聯合主鍵,其允許部分有重複數據

  8. 外鍵:關係數據庫通過外鍵可以實現一對多、多對多和一對一的關係。外鍵既可以通過數據庫來約束,也可以不設置約束,僅依靠應用程序的邏輯來保證。

  9. 查詢SELECT:

    SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合計函數] -> HAVING -> ORDER BY -> LIMIT

    • select_expr
      • 可以用 * 表示所有字段。
      • 可以使用表達式(計算公式、函數調用、字段也是個表達式)
      • 可以爲每個列使用別名。適用於簡化列標識,避免多個列標識符重複。
        • 使用關鍵字as或者省略
    • FROM 子句:用於標識查詢來源。
      • 可以爲表起別名。使用as關鍵字。
      • from子句後,可以同時出現多個表。
    • WHERE 子句:從from獲得的數據源中進行篩選;整型1表示真,0表示假。
    • GROUP BY 子句, 分組子句
      • GROUP BY 字段/別名 [排序方式]
      • 分組後會進行排序。升序:ASC,降序:DESC
      • sum 求和
      • max 求最大值
      • min 求最小值
      • avg 求平均值
    • HAVING 子句,條件子句: 與 where 功能、用法相同,執行時機不同。
      • where 在開始時執行檢測數據,對原數據進行過濾。
      • having 對篩選出的結果再次進行過濾。
      • having 字段必須是查詢出來的,where 字段必須是數據表存在的。
      • where 不可以使用字段的別名,having 可以。因爲執行WHERE代碼時,可能尚未確定列值。
      • where 不可以使用合計函數。一般需用合計函數纔會用 having
    • ORDER BY 子句,排序子句
      • order by 排序字段/別名 排序方式 [,排序字段/別名 排序方式]…
      • 升序:ASC,降序:DESC
      • 支持多個字段的排序。
    • LIMIT 子句,限制結果數量子句
    • DISTINCT, ALL 選項
  10. 插入:INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);

  11. 數據操作:

    1. 增:INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), …]
    2. 查:SELECT 字段列表 FROM 表名[ 其他子句]
    3. 刪: DELETE FROM 表名[ 刪除條件子句]
    4. 改: UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新條件]
  12. 數據庫操作

    1. 查看當前數據庫: SELECT DATABASE();
    2. 顯示當前時間、用戶名、數據庫版本:SELECT now() , user() , version() ;
    3. 創建庫: CREATE DATABASE[ IF NOT EXISTS] 數據庫名 數據庫選項
    4. 查看已有庫:SHOW DATABASES
    5. 查看當前庫信息:SHOW CREATE DATABASE 數據庫名
    6. 修改庫的選項信息:ALTER DATABASE 庫名 選項信息
    7. 刪除庫: DROP DATABASE[ IF EXISTS] 數據庫名(同時刪除數據庫相關目錄以及目錄內容)
  13. 表的操作:

    1. 創建表:CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結構定義 )[ 表選項]
    2. 查看錶: SHOW TABLES FROM 表名
    3. 表選項
      • 字符集:CHARSET = charset_name
      • 自增起始數:AUTO_INCREMENT = 行數
      • 數據文件目錄:DATA DIRECTORY = ‘目錄’
      • 索引文件目錄:INDEX DIRECTORY = ‘目錄’
      • 表註釋: COMMENT = ‘string’
      • 分區選項;PARTITION BY …
    4. 查看錶結構:SHOW CREATE TABLE 表名 (信息更詳細)
    5. 查看所有表:SHOW TABLES FROM 表名
    6. 修改表:
      • 修改表本身的選項: ALTER TABLE 表名 表的選項
      • 對錶進行重命名:RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另一個數據庫)
    7. 刪除表: DROP TABLE[ IF EXISTS] 表名 …
    8. 清空表數據:TRUNCATE [TABLE] 表名
    9. 複製表結構:CREATE TABLE 表名 LIKE 要複製的表名
    10. 複製表結構和數據:CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名
    11. 檢查表是否有錯誤:CHECK TABLE tbl_name [, tbl_name] … [option] …
    12. 優化表:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
    13. 修復表:REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] … [QUICK] [EXTENDED] [USE_FRM]
    14. 分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
  14. 更新數據:UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …;

  15. 刪除數據:DELETE FROM <表名> WHERE …;

  16. 切換數據庫: USE <數據庫>

  17. 顯示當前數據庫所有表: SHOW <表名>

  18. 插入或替換:REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);

  19. 插入或更新:INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99;

  20. 插入或忽略:INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);

  21. 快照:CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;

  22. 關係數據庫規範化是爲了解決數據庫中插入,刪除,數據冗餘問題引入的

  23. 獨立性

    • 邏輯獨立性:應用程序與數據庫中數據的邏輯結構是相互獨立的 是外模式/模式映像
    • 物理獨立性:用戶的應用程序與存儲在磁盤上數據庫中的數據是相互獨立的。是模式/內模式映像
  24. 向用戶授權:GRANT <權限>[,<權限>]… [ON <對象類型> <對象名>] TO <用戶>[,<用戶>]… [WITH GRANT OPTION];

  25. 實體中的任一關鍵字,可能由一個或者多個可區別的實體稽覈中不同個體的屬性組成

  26. 關係型數據庫三級模式二級映射,保證了邏輯獨立性和物理獨立性

  27. E-R模型(實體-聯繫模型)

    • E-R模型可以成功描述數據庫所存儲的數據
    • 基本要素
      • 實體
      • 屬性
      • 聯繫
  28. 觸發器:是用戶定義在關係上的一類由事件驅動的特殊過程。

    • 其中事件是指:增刪改(更新)
  29. 數據庫三級模式:外模式、模式、內模式

    • 模式:邏輯模式、概念模式:描述的是全局邏輯結構,一個數據庫只要一個模式,模式是數據庫的中心與關鍵。
    • 外模式:子模式、用戶模式:是數據庫用戶的數據視圖。是模式的一個子集,多個,保證數據安全性
    • 內模式:存儲模式:一個數據庫只有一個==內模式,它是數據物理結構和存儲方式的描述,是數據庫內部的表示方法。
  30. 兩級映射:

    • 外模式——模式
    • 模式——內模式
  31. SQL語言的組成

    • DCL:數據控制語句
      • grant
      • revoke
    • DDL:數據定義語句
      • DROP
      • CREATE
      • ALTER
    • DML:數據操縱語句
      • INSERT
      • UPDATE
      • DELETE
  32. 三大範式:

    • 第一範式:字段不能再分,
    • 第二範式:在第一範式的基礎上,一行數據只做一件事情,不能出現部分依賴,消除複覈主鍵就可以避免出現部分依賴
    • 第三範式:在第二範式的基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)每個屬性都和主鍵有直接相關關係。
  33. ORDB中複合類型:

    • 結構(行)類型: 不同類型 有序
    • 數組類型:同類 有序
    • 包(多集)類型:同類 無序 可以重複
    • 集合類型:同類 無序 不重複
    • 列表類型:同類 有序 可以重複
  34. 數據庫系統的主要特點:

    • 數據結構化
    • 數據度的冗餘度小
    • 較高的數據獨立性
  35. 數據庫設計的四個階段

    • 需求分析
    • 概念設計:E-R方法,將現實世界的信息結構統一由實體、屬性以及實體之間的聯繫來描述
    • 邏輯設計
    • 物理設計
  36. 屬性:

    • 候選鍵(候選關鍵字、候選碼),能唯一表示關係中的元組
    • 主關係鍵(主鍵、主碼、關係鍵、關鍵字):作爲數據操作的依據,從候選鍵中選擇
    • 主屬性:包含在任一候選關鍵字中的各個屬性
    • 非碼屬性:不包含在任何候選鍵中的屬性
  37. 兩段鎖協議:所有事務必須分兩個階段對數據項加鎖和解鎖,進行讀之前申請S鎖,寫之前申請X鎖

  38. 列屬性:

    1. 主鍵:PRIMARY 能唯一表示記錄的字段,唯一性,不可空,可以由多個字段共同組成,此時需要在字段列表後聲明的方法。
    2. 唯一索引(唯一約束):UNIQUE:使得某字段的值不能重複
    3. 約束:NULL:不是數據類型,是列的一個屬性。
    4. 默認值屬性 DEFAULT:當前字段默認值
    5. 自動增長約束 AUTO-INCREMENT:自動增長必須爲索引(主鍵或unique)
    6. 註釋 Comment
    7. 外鍵約束 FOREIGN KEY :用於限制主表與從表數據完整性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章