MYSQL默認隔離級別為:可重復讀 (Repeated read)
1、innoDB(B+樹)支持事務,適合修改多場景
非葉子節點只存鍵,葉子結點包含全部數據
2、MyIASM不支持事務,適合查詢多場景,寫操作鎖整個表
Oracle默認隔離級別為:讀已提交(READ COMMITTED)
1、select /*parallel*/ * from table 開啟多核計算查詢
redis
1、String、hash、list、set、zset
2、主要用到string、hash;list隊列、set、zset求交並差集
3、持久化RDB性能高、AOF頻率高,優先AOF
緩存
1、緩存雪崩,短時間內大量緩存失效,對數據庫造成巨大壓力,使系統奔潰
設置不同的緩存失效時間
2、緩存穿透,數據庫沒有符合條件的數據,不進行緩存,多次查詢數據庫
空值緩存,短過期時間
3、緩存預熱
4、緩存擊穿,緩存沒有,數據庫有,大並發同時查詢數據庫
加鎖互斥
SQL優化
1、用到索引
2、減少不必要排序
3、減少不必要字段查詢
4、小表在前
5、過濾大的條件盡可能在前
6、組合索引效率高於單個索引
7、msql用到索引覆蓋效率會高很多
索引
1、排序、分組、連表查詢的字段、常作為查詢條件的字段
2、盡量選擇區分度高的字段,索引的字段不能過長(可選擇前綴作為索引)
3、索引列不能參與計算
4、避免創建不必要過多的索引,會增加維護成本
普通索引 最基本的索引,沒有任何限制
唯一索引 與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引 它是一種特殊的唯一索引,不允許有空值。
全文索引 針對較大的數據,生成全文索引很耗時好空間。
組合索引 為了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則
5、or的每個字段都要有索引,模糊只能后模糊,索引字段不能使用函數和計算,is not null不會走索引
數據庫三范式
1、每列數據的原子性,不可拆分
2、非主鍵列只能依賴主鍵,描述每張表做一件事
3、不存在對非主鍵列的傳遞依賴
事務ACID
1、原子性
2、一致性
3、隔離性
4、永久性
5、分布式多庫事務,分階段提交
6、柔性事務(分布式的分階段提交、補償型在分階段上保證高效,異步確保型消息中間件解耦,異步確保上多次重試型)
事務的四種隔離級別
1、讀未提交,臟讀讀其它事務未提交的數據
2、讀已提交,不可重復讀一次事務多次讀取其它事務提交的數據不一致
3、可重復度,幻讀一次事務中多次讀取,其它事務進行增加刪除導致的結果集不一致
4、串行化
CAP
1、一致性、所有節點訪問同一份最新的數據副本
2、可用性、對數據更新具備高可用性
3、分區容錯性、能在時限內達成數據一致性
存儲過程(特定功能的 SQL 語句集)
1、一次編譯多次調用的SQL語句集
2、少使用游標性能不高,事務越短越好,中間結果存放臨時表加索引
觸發器(一段能自動執行的程序)
1、表發生新增、修改、刪除操作時觸發的特殊存儲過程
數據庫並發
1、樂觀鎖、悲觀鎖、時間戳
2、樂觀鎖,認為讀的時候不會寫
3、悲觀鎖,寫的時候不允許讀(寫鎖,排它鎖;讀鎖,共享鎖)
4、時間戳(版本號),表中加一列時間戳,每次讀出來回血+1,寫的時候和原來值比較
5、行級鎖,是一種排它鎖
6、表級鎖,有共享鎖和排它鎖
7、頁級鎖,介於行級和表級中間,鎖定一組相近的數據
分區分表
1、分庫分表,垂直切分,不同業務表分在不同數據庫
2、分庫分表,水平切分,根據某個字段值,按照規則將大表拆分為多個小表
3、分區,按照分區規則,數據庫在物理上多張表邏輯上一張表,索引等都由數據庫維護