事務的原理、特性、事務併發控制
常用的字段、含義和區別
常用資料庫引擎之間的區別
事務是資料庫併發控制的基本單位
事務可以看作是一系列sql語句的集合
事務必須要麼全部執行成功,要麼全部執行失敗(回滾)(原子性)
acid是事務的四個基本特性
原子性(atomicity):乙個事務中所有操作全部完成或失敗
一致性(consistency):事務開始和結束之後資料完整性沒有破壞(a轉賬50給b,要麼失敗回滾a50,要麼b加50,不能憑空消失)
隔離性(isolation):允許多個事務同時對資料庫修改和讀寫
永續性(durability):事務結束後,修改是永久的不會丟失,一般儲存到磁碟上
幻讀(phantom read):乙個事務第二次出現第一次沒有的結果
非重複讀(nonrepeatable read):乙個事務重複讀兩次得到不同的結果
髒讀(dirty read):乙個事務讀取到另乙個事務還沒有提交的修改
修改丟失(lose update):併發的時候導致一些修改丟失
讀未提交(read uncommitted):別的事務可以讀取到還沒提交的修改
讀已提交 (read committed):別得事務只能讀取到提交的修改
可重複讀(repteatable read):同一事務先後查詢結果一樣(mysql預設級別)
序列化(serialized):事務完全序列化的執行,隔離級別最高,執行效率最低
使用資料庫的唯一索引
使用佇列非同步寫入
使用redis等實現分布式鎖
悲觀鎖是先獲取鎖再進行操作。一鎖二查三更新 select for update
樂觀鎖先修改,更新的時候發現資料以及改變就回滾(check and set)一般通過版本號來識別
使需要根據響應速度、衝突頻率、重試代價來判斷使用哪一種
myisam不支援事務,innodb支援事務
myisam不支援外來鍵,innodb支援外來鍵
myisam不支援行鎖,innodb支援行鎖和表鎖
myisam引擎的資料在物理磁碟上是按照順序儲存的,而innodb引擎的表資料是隨機分布的
myisam的主鍵索引的葉子節點只存放資料在物理磁碟上的指標,其他次索引也是一樣的;
innodb的主鍵索引的葉子節點下面直接存放資料,其他次索引的葉子節點指向主鍵id;
索引的原理、型別、結構
建立索引的注意事項、使用原則
如何排查和消除慢索引
索引是資料表中乙個或者多個列進行排序的資料結構
索引能夠大幅提公升檢索速度
建立、變更索引也是需要時間和空間
線性查詢:乙個個查詢,簡單,慢
二分查詢:有序、簡單;要求有序,插入慢
雜湊查詢:查詢快,占用空間大,不太適合大規模資料
二叉樹查詢:插入和查詢很快(log(n)),無法儲存大量資料,容易出現複雜度退化,也會導致查詢變成遍歷
二插平衡樹查詢:解決二插查詢樹(bst)的退化問題,樹是平衡的,節點多的時候,樹還是比較高,保證了查詢速度,但是插入和更新資料也會帶來平衡的代價
多路樹查詢:乙個父親節點多個孩子節點,樹高不會特別深
多路平衡樹查詢:b-tree,缺點:不能範圍查詢
多路平衡查詢樹(每個節點最多m(m>2)個孩子,稱為m階或者度)
葉節點具有相同的高度
節點中的資料key從左到右是遞增有序的
五階樹
b-tree的變形
只有葉子節點帶有指向記錄的指標(為什麼?可以空出更多的空間,可以增加樹的寬度)
葉子節點通過指標相連(可以進行範圍查詢)
為了作業系統更好讀取和快取我們的資料,我們以磁碟塊的大小來覺得b+樹的階,讓作業系統更好的載入快取
普通索引
唯一索引,索引列的值必須唯一
多列索引
主鍵索引,乙個表只有乙個
全文索引,innodb不支援
經常使用查詢條件的字段(where)
經常用作表連線的字段
經常出現order_by,group_by之後的字段
非空字段not null,mysql很難對空值做查詢優化,所以很多在建立欄位的時候回提供預設值,不為空
區分度大,離散度高,作為索引字段盡量不要大量重複相同的值
索引長度不能太長(比如字串太長比較的時候容易耗費時間)
記憶口訣:模糊匹配、隱式轉換、最左原則,key沒有辦法比較的時候,就會實現
以%開頭的like語句,模糊搜查
出現隱式型別轉換(在python這種動態語言查詢中需要注意(str轉int)
沒有滿足最左字首匹配原則(為什麼最左匹配,abc,ab,a可以,bc不可以,因為少了a的基準無法比較)
聚集還是非聚集指的是b-tree葉子節點存的是指標還是資料記錄
myisam索引和資料分離,使用的是非聚集索引
innodb資料檔案就是索引檔案,主鍵索引就是聚集索引
慢查詢通常是缺少索引、索引不合理或者業務**實現導致
slow_query_log_file 開啟並查詢慢查詢日記
通過explain排查索引的問題
調整資料修改索引;業務**層限制不合理訪問
樂觀鎖:通常認為別的執行緒不會修改資料,從而不上鎖,只會判斷資料是否發生了改變,通常使用版本號來進行判斷,然後交給業務層去處理
悲觀鎖:認為別的執行緒會修改資料,所以每次拿資料都會上鎖
表鎖:直接鎖定整張表,在你鎖定期間,其它程序無法對該錶進行寫操作。如果你是寫鎖,則其它程序則讀也不允許。
行鎖:僅對指定的記錄進行加鎖,這樣其它程序還是可以對同乙個表中的其它記錄進行操作。
共享鎖(讀鎖)、排他鎖(寫鎖):顧名思義,共享鎖可以被別人的執行緒讀取,但不能修改,排它鎖不能被別的執行緒讀取和修改
意向鎖:行鎖和表鎖的出現,為了提高效率,先申請表的意向共享鎖,再申請行的寫鎖
資料庫正規化
Mysql基礎知識 索引
mysql 索引 1.索引的概念 索引是建立在表上的,對資料庫表中的一列或多列的值進行排序的一種結構。索引有2種儲存型別 b型樹索引 和 雜湊索引。innodb和myisam儲存引擎支援b型樹索引,memory儲存引擎支援雜湊索引。優點 提高檢索資料的速度。對於有依賴關係的子表和父表之間的聯合,可提...
mysql基礎知識之索引
mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。索引其實和字典的目錄很相似,字典可以根據拼音和部首偏旁快速查詢到指定的字。對於mysql資料庫來說,索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,...
基礎知識 索引和分片
單個索引大於等於字串的長度時,會報錯 分片用來從序列中提取出想要的子串行,其用法為 var lower upper step 也可以使用負索引來指定分片的範圍 lower和upper可以省略,省略lower意味著從開頭開始分片,省略upper意味著一直分片到結尾。每隔兩個取乙個值 當step的值為負...