數據庫相關知識
-
事務是邏輯上的一組操作,要麼都執行,要麼都不執行
-
事務的四大特性
- 原子性:事務時最小的執行單位,不允許分隔。
- 一致性:執行事務前後,數據保持一致,多個事務對同一數據讀取的結果 是相同的
- 隔離性:併發訪問數據庫時,一個用戶的事務不被其他事務所幹擾,各併發事務之間數據庫是獨立的
- 持久性:一個事務被提交之後。它對數據庫中數據的改變是持久的,即使數據庫發生故障也不應該對其有任何影響。
-
併發事務問題:
- 髒讀:後者對還未同步到數據庫中的數據再次修改
- 丟失修改:兩者同時修改
- 不可重複讀:一個事務兩次讀之間有事務對其數據進行了修改
- 幻讀:類似於不可重複讀(修改)幻讀重點是增加刪除
-
sql四個隔離級別:
隔離級別 髒讀 不可重複讀 幻讀 READ-UNCOMMITTED(讀取未提交) √ √ √ READ-COMMITTED(讀取已提交) × √ √ REPEATABLE-READ(可重複讀) × × √ SERIALIZABLE(可串行化) × × × -
索引
- 優點:
- 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性
- 可以大大加快檢索速度
- 幫助服務器避免排序和臨時表
- 將隨機IO變成順序IO
- 加速表與表之間的連接
- 優點:
- 缺點:
- 當進行增刪修的時候索引也需要動態維護,降低了維護速度
- 需要佔用物理空間
- 創建索引和維護索引需要時間
- 通過將無序數據變成有序數據,來加快查詢速度
- 當進行增刪修的時候索引也需要動態維護,降低了維護速度
- 注意事項:
- 避免where子句對字段施加函數,會造成無法命中索引
- 在使用InnoDB時使用與業務無關的自增主鍵作爲左鍵,即使用邏輯主鍵而不要更用業務主鍵
- 將打算加索引的列設置爲NOT NULL,否則將導致引擎放棄使用索引
- 刪除長期未使用的索引
- 在使用limit offset查詢緩慢時,可以使用藉助索引提交性能
- 聚集(主鍵)和非聚集(非主鍵)索引
- 區別聚合索引在葉子節點存儲的是表中的數據,非聚合索引在葉子節點存儲的是主鍵和索引列,所以非聚合索引也叫做二級索引。
- 索引最左匹配原則(MySQL會質疑向右匹配知道遇到範圍查詢)
- 索引可以簡單如一個列,也可以複雜如多個列,即聯合索引
- 如果是聯合索引,內碼key也由多個列組成,同時索引也只能用於查找key是否存在、
- 因此列的排列順序決定了可命中索引的列數
- 使用保留字UNION可以使索引值在基本表中唯一
- 覆蓋索引:就是包含了所有查詢字段 (where,select,ordery by,group by 包含的字段) 的索引
- 好處:避免Innodb表進行索引的二次查詢;可以把隨機IO變成順序IO加快查詢效率
- 避免where子句對字段施加函數,會造成無法命中索引
-
鎖:處理解決併發問題
- 分類
- 從數據庫:排它鎖(X鎖),共享鎖(S,讀鎖),更新鎖(U)
- 從程序員:悲觀鎖,樂觀鎖
- InnpDB支持行鎖和表鎖,而MyISAM只支持表鎖
- 判斷死鎖
- 超時法
- 等待圖法:出現迴路
- 減少死鎖
- 以固定的順序訪問表和行
- 大事務拆小
- 降低隔離級別
- 爲表添加合理的索引
- 樂觀鎖和悲觀鎖
- 樂觀鎖:認爲不會鎖定的情況下去更新數據,如果發現不對勁,纔不更新(回滾)。在數據庫中往往添加一個version字段來實現。適用於多讀的應用類型,提高吞吐量
- 悲觀鎖:用的就是數據庫的行鎖,認爲數據庫會發生併發衝突,直接上來就把數據鎖住,其他事務不能修改,直至提交了當前事務
- 分類
-
大表優化
- 限定數據的範圍
- 讀寫分離,主庫負責寫,從庫負責讀
- 垂直分區:根據數據庫裏面數據表的相關性進行拆分,分列
- 優點:列數據變小,在查詢是減少讀取的Block數,減少I/O次數,還可以簡化表的結構,易於維護
- 缺點:主鍵出現冗餘,需要管理冗餘列,並會引起Join操作,可以通過在應用層進行Join來解決。此外,垂直分區會讓事務變得更加複雜
- 水平分區:保持數據結構不變,通過某種策略存儲數據分片。水平拆分可以支持很大的數據量
-
MySQL主要Server 層和引擎層:
- Server 層主要包括連接器、查詢緩存、分析器、優化器、執行器,同時還有一個日誌模塊(binlog),這個日誌模塊所有執行引擎都可以共用,redolog 只有 InnoDB 有。
- 引擎層是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。
-
SQL 等執行過程分爲兩類
- 一類對於查詢等過程如下:權限校驗—查詢緩存—分析器—優化器—權限校驗—執行器—引擎
- 對於更新等語句執行流程如下:分析器----權限校驗----執行器—擎---redo log prepare—binlog—redo log commit
-
數據庫模型:
- 層級模型
- 網狀模型
- 關係模型
-
對於主鍵來說基本原則就是:不使用任何業務相關的字段作爲主鍵。(身份證,手機號)
-
另外還有聯合主鍵,其允許部分有重複數據
-
外鍵:關係數據庫通過外鍵可以實現一對多、多對多和一對一的關係。外鍵既可以通過數據庫來約束,也可以不設置約束,僅依靠應用程序的邏輯來保證。
-
查詢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 選項
- select_expr
-
插入:INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);
-
數據操作:
- 增:INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), …]
- 查:SELECT 字段列表 FROM 表名[ 其他子句]
- 刪: DELETE FROM 表名[ 刪除條件子句]
- 改: UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新條件]
-
數據庫操作:
- 查看當前數據庫: SELECT DATABASE();
- 顯示當前時間、用戶名、數據庫版本:SELECT now() , user() , version() ;
- 創建庫: CREATE DATABASE[ IF NOT EXISTS] 數據庫名 數據庫選項
- 查看已有庫:SHOW DATABASES
- 查看當前庫信息:SHOW CREATE DATABASE 數據庫名
- 修改庫的選項信息:ALTER DATABASE 庫名 選項信息
- 刪除庫: DROP DATABASE[ IF EXISTS] 數據庫名(同時刪除數據庫相關目錄以及目錄內容)
-
表的操作:
- 創建表:CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結構定義 )[ 表選項]
- 查看錶: SHOW TABLES FROM 表名
- 表選項
- 字符集:CHARSET = charset_name
- 自增起始數:AUTO_INCREMENT = 行數
- 數據文件目錄:DATA DIRECTORY = ‘目錄’
- 索引文件目錄:INDEX DIRECTORY = ‘目錄’
- 表註釋: COMMENT = ‘string’
- 分區選項;PARTITION BY …
- 查看錶結構:SHOW CREATE TABLE 表名 (信息更詳細)
- 查看所有表:SHOW TABLES FROM 表名
- 修改表:
- 修改表本身的選項: ALTER TABLE 表名 表的選項
- 對錶進行重命名:RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另一個數據庫)
- 刪除表: DROP TABLE[ IF EXISTS] 表名 …
- 清空表數據:TRUNCATE [TABLE] 表名
- 複製表結構:CREATE TABLE 表名 LIKE 要複製的表名
- 複製表結構和數據:CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名
- 檢查表是否有錯誤:CHECK TABLE tbl_name [, tbl_name] … [option] …
- 優化表:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
- 修復表:REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] … [QUICK] [EXTENDED] [USE_FRM]
- 分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
-
更新數據:UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …;
-
刪除數據:DELETE FROM <表名> WHERE …;
-
切換數據庫: USE <數據庫>
-
顯示當前數據庫所有表: SHOW <表名>
-
插入或替換:REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
-
插入或更新:INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99;
-
插入或忽略:INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
-
快照:CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;
-
關係數據庫規範化是爲了解決數據庫中插入,刪除,數據冗餘問題引入的
-
獨立性
- 邏輯獨立性:應用程序與數據庫中數據的邏輯結構是相互獨立的 是外模式/模式映像
- 物理獨立性:用戶的應用程序與存儲在磁盤上數據庫中的數據是相互獨立的。是模式/內模式映像
-
向用戶授權:GRANT <權限>[,<權限>]… [ON <對象類型> <對象名>] TO <用戶>[,<用戶>]… [WITH GRANT OPTION];
-
實體中的任一關鍵字,可能由一個或者多個可區別的實體稽覈中不同個體的屬性組成
-
關係型數據庫三級模式二級映射,保證了邏輯獨立性和物理獨立性
-
E-R模型(實體-聯繫模型)
- E-R模型可以成功描述數據庫所存儲的數據
- 基本要素
- 實體
- 屬性
- 聯繫
-
觸發器:是用戶定義在關係上的一類由事件驅動的特殊過程。
- 其中事件是指:增刪改(更新)
-
數據庫三級模式:外模式、模式、內模式
- 模式:邏輯模式、概念模式:描述的是全局邏輯結構,一個數據庫只要一個模式,模式是數據庫的中心與關鍵。
- 外模式:子模式、用戶模式:是數據庫用戶的數據視圖。是模式的一個子集,多個,保證數據安全性
- 內模式:存儲模式:一個數據庫只有一個==內模式,它是數據物理結構和存儲方式的描述,是數據庫內部的表示方法。
-
兩級映射:
- 外模式——模式
- 模式——內模式
-
SQL語言的組成
- DCL:數據控制語句
- grant
- revoke
- DDL:數據定義語句
- DROP
- CREATE
- ALTER
- DML:數據操縱語句
- INSERT
- UPDATE
- DELETE
- DCL:數據控制語句
-
三大範式:
- 第一範式:字段不能再分,
- 第二範式:在第一範式的基礎上,一行數據只做一件事情,不能出現部分依賴,消除複覈主鍵就可以避免出現部分依賴
- 第三範式:在第二範式的基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)每個屬性都和主鍵有直接相關關係。
-
ORDB中複合類型:
- 結構(行)類型: 不同類型 有序
- 數組類型:同類 有序
- 包(多集)類型:同類 無序 可以重複
- 集合類型:同類 無序 不重複
- 列表類型:同類 有序 可以重複
-
數據庫系統的主要特點:
- 數據結構化
- 數據度的冗餘度小
- 較高的數據獨立性
-
數據庫設計的四個階段
- 需求分析
- 概念設計:E-R方法,將現實世界的信息結構統一由實體、屬性以及實體之間的聯繫來描述
- 邏輯設計
- 物理設計
-
屬性:
- 候選鍵(候選關鍵字、候選碼),能唯一表示關係中的元組
- 主關係鍵(主鍵、主碼、關係鍵、關鍵字):作爲數據操作的依據,從候選鍵中選擇
- 主屬性:包含在任一候選關鍵字中的各個屬性
- 非碼屬性:不包含在任何候選鍵中的屬性
-
兩段鎖協議:所有事務必須分兩個階段對數據項加鎖和解鎖,進行讀之前申請S鎖,寫之前申請X鎖
-
列屬性:
- 主鍵:PRIMARY 能唯一表示記錄的字段,唯一性,不可空,可以由多個字段共同組成,此時需要在字段列表後聲明的方法。
- 唯一索引(唯一約束):UNIQUE:使得某字段的值不能重複
- 約束:NULL:不是數據類型,是列的一個屬性。
- 默認值屬性 DEFAULT:當前字段默認值
- 自動增長約束 AUTO-INCREMENT:自動增長必須爲索引(主鍵或unique)
- 註釋 Comment
- 外鍵約束 FOREIGN KEY :用於限制主表與從表數據完整性