1. 程式人生 > 實用技巧 >資料庫相關 知識點

資料庫相關 知識點

redis相關知識點

1.快取穿透:是指訪問一個數據庫肯定不存在的資料,如遇到惡意攻擊會對資料庫造成極大壓力,甚至壓垮資料庫.
2.快取雪崩:是指某一時間段,快取集中過期失效,對資料的查詢將全部落入資料庫,對資料庫造成周期性壓力波峰.
3.快取擊穿:是指一個key非常熱點,在不停的扛著大併發,大併發集中對一個點進行訪問,當這個keyzai失效的一瞬
           間,持續的大併發擊破快取,進而直接訪問資料庫.
    
redis的兩種持久方式
    1.rdb: 是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,實際操作過程是fork一個子程序,
           先將資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進位制壓縮儲存
      優點:
1.是一個@非常緊湊的檔案件,儲存了某個時間點上的資料集,非常適合進行備份 注:遇到問題可以隨時將資料集還原到不同版本 2.非常適合災難恢復,由於@,可以加密後傳輸到別的資料中心 3.可以最大化redis的效能 4.恢復大資料集是的速度比aof快 缺點:儲存整個資料集的狀態並不輕鬆,至少5分鐘1次,一旦發生故障會丟失幾分鐘的資料 2.aof: 是以日誌的形式記錄伺服器執行的所有寫操作命令,恢復時是通過重新執行這些命令來還原資料集 優點:1.會讓redis非常耐久,發生故障最多丟失1秒鐘的資料 缺點:
1.對相同資料集來說,aof檔案體積 > rdb檔案體積,而且aof恢復速度慢與adb `` mysql相關: 資料庫的髒讀、不可重複讀、幻讀都和事務的隔離性有關; 原子性(Atomicity):事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。 一致性(Consistemcy):事務前後,資料庫的狀態都滿足所有的完整性約束。 隔離性(Isolation):併發執行的N個事務是隔離的,一個不影響一個,一個事務在沒有commit之前,被修改的資料不可能被其他事務看到; 永續性(Durability):永續性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。永續性主要在於DBMS的恢復效能 髒讀:髒讀又稱無效資料讀出。一個事務讀取另外一個事務還沒有提交的資料叫髒讀; eg:事務T1修改了一行資料,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的資料, 之後事務T1因為某種原因Rollback了,那麼事務T2讀取的資料就是髒的。 解決辦法:把資料庫的事務隔離級別調整到READ_COMMITTED 不可重複讀:不可重複讀是指在同一個事務內,兩個相同的查詢返回了不同的結果(不可重複讀的重點是修改 ) eg:事務T1讀取某一資料,事務T2讀取並修改了該資料,T1為了對讀取值進行檢驗而再次讀取 該資料,便得到了不同的結果。 解決辦法:把資料庫的事務隔離級別調整到REPEATABLE_READ 幻讀:(幻讀的重點在於新增或者刪除 ) 系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄, 當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀: 解決方案: 四種隔離級別,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。
1.Read uncommitted 讀未提交 可能出現髒讀 eg:公司發工資了,把50000元打到我的賬號上,但是該事務並未提交,而我正好去檢視賬戶,發現工資已經到賬,是50000元整, 非常高興。可是不幸的是,領導發現發給的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後我 實際的工資只有2000元,空歡喜一場。 2.Read committed 讀提交 避免了髒讀,但可能會造成不可重複讀 eg:我拿著工資卡去消費,系統讀取到卡里確實有2000元,而此時老婆也正好在網上轉賬,把工資卡的2000元轉到她賬戶,並在我 之前提交了事務,當我扣款時,系統檢查到工資卡已經沒有錢,扣款失敗,十分納悶,明明卡里有錢,為何...... 3.Repeatable read 重複讀 可以避免不可重複讀,但會造成幻讀 eg:當我拿著工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),我老婆就不可能對該記錄進行修改,也就是不能在 此時轉賬。 4.Serializable 序列化 可避免髒讀、不可重複讀、幻讀的發生 分表: 垂直分表:基於資料庫的列進行,某個表的欄位比較多,可以新建一張擴充套件表,將不常用的欄位或長度較大的欄位拆分出去到擴充套件表中. 優點:1.通過大表拆小表,便於維護與開發,可避免跨頁問題,減少額外的效能開銷. 2.資料庫以行問單位將資料載入到記憶體中,這樣表中的欄位較短且訪問頻率較高,記憶體能載入更多資料,命中率更高,減少磁 盤io,從而提高資料庫效能. 水平分表:將表中不同資料行按照一定規律分佈到不同的資料庫表中(表儲存在同一個資料庫中),從而降低單表資料量,優化效能 方法:通過主鍵或時間等欄位進行hash和取模後拆分 分庫: 垂直分庫:按照業務模組來劃分不同的資料庫,而不是將所有資料表放在同一個資料庫中. eg:可以將查詢庫和系統庫分開了,這樣如果有大查詢也不會影響系統庫 查詢優化 1.注意事項 1.儘量使用簡單的查詢,避免使用表連線 2.儘量避免全表查詢 3.不要用select * 4.在索引欄位上查詢儘量不要用資料庫函式,不便於快取查詢結果 5.千萬不要 order by rand(),效能極低 鎖: 用於多使用者環境下保證資料庫完整性和一致性. 分類: 資料庫系統角度分為三種:排他鎖、共享鎖、更新鎖. 從程式設計師角度分為兩種:一種是悲觀鎖,一種樂觀鎖。 悲觀鎖: 定義: 很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人 拿這個資料就會block(阻塞),直到它拿鎖;悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有 資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也 無法保證外部系統不會修改資料). 共享鎖(share lock): 定義: S鎖,也叫讀鎖,用於所有的只讀資料操作。共享鎖是非獨佔的,允許多個併發事務讀取其鎖定的資源 性質: 1. 多個事務可封鎖同一個共享頁; 2. 任何事務都不能修改該頁; 3. 通常是該頁被讀取完畢,S鎖立即被釋放。 排他鎖(Exclusive Lock): 定義: X鎖,也叫寫鎖,表示對資料進行寫操作。如果一個事務對物件加了排他鎖,其他事務就不能再給它加任何鎖了。 eg: 某個顧客把試衣間從裡面反鎖了,其他顧客想要使用這個試衣間,就只有等待鎖從裡面打開了. 性質: 1. 僅允許一個事務封鎖此頁; 2. 其他任何事務必須等到X鎖被釋放才能對該頁進行訪問; 3. X鎖一直到事務結束才能被釋放 更新鎖: 定義: U鎖,在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現象。 注: 1.首先獲得一個共享鎖,讀取資料,然後將共享鎖升級為排他鎖,再執行修改操作; 這時,這些事務都不會釋放共享鎖,而是一直等待對方釋放,這樣就造成了死鎖。 2.一個數據在修改前直接申請更新鎖,在資料修改時再升級為排他鎖,就可以避免死鎖 性質: 1. 用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖; 2. 當被讀取的頁要被更新時,則升級為X鎖; 3. U鎖一直到事務結束時才能被釋放 樂觀鎖: 定義: 很樂觀,每次去拿資料的時候都認為別人不會修改,所以,不會上鎖。但是在更新的時候 會判斷一下在此期間別人有沒有更新這個資料,可以使用版本號等機制 使用場景: 樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖 活鎖: 定義: 指的是T1封鎖了資料R,T2同時也請求封鎖資料R,T3也請求封鎖資料R,當T1釋放了鎖之後, T3會鎖住R,T4也請求封鎖R,則T2就會一直等待下去。 解決方法: 採用“先來先服務”策略可以避免。 死鎖: 定義: 就是我等你,你又等我,雙方就會一直等待下去。 比如: T1封鎖了資料R1,正請求對R2封鎖,而T2封住了R2,正請求封鎖R1,這樣就會導致死鎖, 死鎖這種沒有完全解決的方法,只能儘量預防 預法: 1. 一次封鎖法,指的是一次性把所需要的資料全部封鎖住,但是這樣會擴大了封鎖的範圍,降低系統的併發度; 2. 順序封鎖法,指的是事先對資料物件指定一個封鎖順序,要對資料進行封鎖,只能按照規定的順序來封鎖, 但是這個一般不大可能的。 分散式鎖: 定義: 是控制分散式系統之間同步訪問共享資源的一種方式。在分散式系統中,常常需要協調他們的動作。 如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那麼訪問這些資源的時候,往 往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分散式鎖。 * primary key * unique key * index key 上面三種key前兩種除了有加速查詢的效果之外還有額外的約束條件(primary key:非空且唯一,unique key:唯一), 而index key沒有任何約束功能只會幫你加速查詢 索引: 定義:就是一種資料結構,類似於書的目錄。意味著以後再查資料應該先找目錄再找資料,而不是用翻頁的方式查詢資料 本質:通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說, 有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。** 影響: * 在表中有大量資料的前提下,建立索引速度會很慢 * 在索引建立完畢後,對錶的查詢效能會大幅度提升,但是寫的效能會降低 **聚集索引(primary key)** **特點:**葉子結點放的一條條完整的記錄 **輔助索引(unique,index) 輔助索引:查詢資料的時候不可能都是用id作為篩選條件,也可能會用name,password等欄位資訊,那麼這個時候就無法 利用到聚集索引的加速查詢效果。就需要給其他欄位建立索引,這些索引就叫輔助索引 **特點:**葉子結點存放的是輔助索引欄位對應的那條記錄的主鍵的值 (比如:按照name欄位建立索引,那麼葉子節點存放的是:{name對應的值:name所在的那條記錄的主鍵值}) select name from user where name='jason'; 上述語句叫覆蓋索引:只在輔助索引的葉子節點中就已經找到了所有我們想要的資料 select age from user where name='jason'; 上述語句叫非覆蓋索引,雖然查詢的時候命中了索引欄位name,但是要查的是age欄位,所以還需要利用主鍵才去查詢