範式
第一範式(1NF)
字段不可分,強調錶的原子性。
反例:
第二範式(2NF)
就是要有主鍵,要求其他字段都依賴於主鍵。
表中的字段必須完全依賴於全部主鍵而非部分主鍵
第三範式(3NF)
就是要消除傳遞依賴,數據只在一個地方存儲,不重複出現在多張表中。
非主鍵外的所有字段必須互不依賴
索引
1、B+樹:
B+樹 結構:
1、其他節點只存鍵,不保存數據,2、所有葉子節點存鍵和值,3、從小到大構成一個鏈表
B+樹 優點:
- 查詢穩定:因爲只有葉子存值,所以每次都遍歷到葉子節點。
- 減少磁盤IO:節點存元素更多,IO次數少。
- 方便範圍查詢:因爲值是在葉子節點上,結構是鏈表,方便範圍查詢
數據庫爲什麼用B+樹而不用B樹:
1、B樹只適合隨機檢索,而B+樹同時支持隨機檢索和順序檢索;
2、B+樹空間利用率高,可減少I/O次數
3、B+樹的查詢效率更加穩定,每次查詢到葉子節點(葉子節點存值)。
4、B+樹遍歷效率高,因爲數據在葉子節點構成的鏈表上
5、增刪改快,因爲B+是數據存鏈表上
2、索引類型(聚集、非聚集):
· 聚集索引:
表中各行的物理順序與鍵值的索引順序相同,每個表只能有一個
· 非聚集索引:
非聚集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另一個位置,索引中包含指向數據存儲位置的指針。可以有多個,小於249個
3、MyISAM和InnoDB
此處可查看:https://blog.csdn.net/hguisu/article/details/7786014
MyISAM 索引
非聚集索引。採用B+樹,葉子節點保存數據地址,一個保存地址,一個保存數
據
特點:OLAP、不支持事物、支持全文索引
InnoDB 索引
聚集索引。採用B+樹,葉子節點保存數據,本身就是一個主索引
特點:OLTP、支持事物、表空間大、支持行鎖
二者對比圖:
4、創建索引時需要注意什麼?
避免非空字段(NULL):索引以及比較運算更加複雜。
索引字段越小越好:IO操作獲取效率高。
5、最左匹配原則
mysql的查詢器,會從最左開始向右匹配,直到遇到範圍查詢就停止匹配(>、<、between、like),右邊的索引不生效。(因爲底層是B+樹,從左到右建立搜索樹的)
例子:
a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整
事物
1、數據庫事務
事務是一個不可分割的數據庫操作序列,也是數據庫併發控制的基本單位,其執行的結果必須使數據庫從一種一致性狀態變到另一種一致性狀態。
2、四大特性(簡稱ACID)
數據庫如果支持事務的操作,那麼就具備以下四個特性:
原子性(Atomicity)
事務是數據庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
一致性(Consistency)
事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(Isolation)
一個事務的執行不被其他事務干擾。
持續性/永久性(Durability)
一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
3、事務隔離級別
髒讀(中間有事物取消):(1更新->2讀->1回滾 ===》 2不準確)
一個事務讀到了另一個事務中尚未提交的數據
不可重複讀(中間有條更新):(1查詢->2更新->1查詢 ===》 1不一致)
在一個事務的兩次讀取的數據不一致,這可能是兩次查詢過程中間插入了一個事務更新update的原有的數據。
幻讀(中間列更新):
一個事務中兩次讀取的數據的數量不一致,要求在一個事務多次讀取的數據的數量是一致的,這是insert或delete時引發的問題
4、MySQL數據庫有四種隔離級別
上面的級別最低,下面的級別最高。
數據庫-鎖
1、分類:
從數據庫系統角度分爲三種:排他鎖、共享鎖、更新鎖。
從程序員角度分爲兩種:一種是悲觀鎖,一種樂觀鎖。
2、悲觀鎖
一、按行爲劃分
1)共享鎖(S)
讀鎖,用於所有的只讀數據操作,可併發讀
2)排它鎖(X)
寫鎖,和試衣間類似,換衣服上鎖,換完出來讓出鎖來。只能一個事物
3)更新鎖(U)
修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖升級排它鎖造成的死鎖現象
更新鎖實現步驟:
- 用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;
2. 當被讀取的頁要被更新時,則升級爲X鎖;
3. U鎖一直到事務結束時才能被釋放。
二、按鎖作用範圍劃分
1)行鎖
鎖的作用範圍是行級別。 ... where id =xxx (id是主鍵,知道用哪個行,用行鎖)
2)表鎖
鎖的作用範圍是整張表。 ... where name =xxx (name不是主鍵,不知道用哪個行,鎖整個表)
3、樂觀鎖
每次去拿數據的時候都認爲別人不會修改,所以,不會上鎖。但是在更新的時候會判斷一下在此期間別人有沒有更新這個數據,可以使用版本號等機制。
1)版本號 (新建一個字段version來+1操作)
2)時間戳 (同版本號,只是改爲時間戳)
3)待更新字段 (更新提交前,查看現在讀的和之前讀的值是否一致,不一致則更不更新)
活鎖、死鎖(併發)
活鎖:
多個事物封鎖同一數據。 解決:先來先服務
死鎖:
我鎖你,你又鎖我。 預防:1、一次全封鎖法 2、順序封鎖法
判定死鎖的方法:
1、超時法
2、等待圖法:事務等待圖出現了迴路。
主從複製(binlog)
將主數據庫中的DDL和DML操作通過二進制日誌(BINLOG)傳輸到從數據庫上,然後將這些日誌重新執行(重做);從而使得從數據庫的數據與主數據庫保持一致。
MYSQL binlog格式
binlog的格式有三種:STATEMENT、ROW、MIXED 。
1、STATEMENT:基於SQL語句的複製 ,IO小、主從數據可能不一致
2、ROW:基於行的複製,IO大,數據保證一致
3、MIXED:二者混用
數據庫優化:(包含索引失效)
- sql語句優化
- 最左前綴規則,而導致索引失效
- 避免select *
- 不用NULL,導致索引失效
- != 和 <> 導致索引失效
- like不要 %abc ,導致索引失效
- explain select 分析查詢語句
- 連接來代替子查詢
- 對於經常查詢的,可開啓緩存
2、索引優化
1)建立索引
2)避免索引失效:like %、NULL、!=、最左前綴
3)索引中,重複數據不要太多
4)Order by與group by字段最好是索引字段。
3、表優化
1)水平切分,分庫分表,mycat
2)垂直切分,分佈式系統
3)對於常查詢的,建立中間表
4)儘量使用數字類型
4、其他優化
1)第二緩存,redis
2)集羣、讀寫分離
3)配置參數優化(增加最大連接數)
4)開啓慢查詢,查看相關的來優化