mysql非線性資料庫 MySQL基礎篇

2021-10-18 21:14:08 字數 2873 閱讀 4270

資料庫事務 :資料庫中一組原子性的sql操作,彼此狀態一致。具有acid特性。

事務 acid 特性:

原子性:資料庫事務是乙個整體,其中的sql操作要麼全部提交成功commit要麼全部失敗回滾rollback,不可分割;

一致性:與原子性有聯絡。事務總是從乙個一致狀態轉換到另乙個一致狀態;

隔離性:事務之間彼此互不影響,乙個事務在提交之前,對其他事務是不可見的。

永續性:乙個事務一旦提交成功,他所做的修改就會永久性的儲存在資料庫中。

mysql 4 種隔離級別

未提交讀read uncommitted:乙個事務在提交之前,對其他事務是可見的,即事務可以讀取未提交的資料。存在「髒讀」(讀到了髒資料)問題;

提交讀read committed:事務在提交之前,對其它事務是不可見的。存在「不可重複讀」(兩次查詢的得到的結果可能不同,即可能在查詢的間隙,有事務提交了修改)問題。解決了「髒讀」問題。

可重複讀repeatable read:在同一事務中多次讀取的資料是一致的。解決了髒讀和不可重複讀問題,存在「幻讀」(在事務兩次查詢間隙,有其他事務又插入或刪除了新的記錄)。--- mysql預設隔離級別。

可序列化serializable:強制事務序列化執行。即乙個事物乙個事物挨個來執行,可以解決上述所有問題。

鎖及粒度:

共享鎖/讀鎖:互不阻塞,優先順序低

排他鎖/寫鎖:阻塞其他鎖,優先順序高,即確保在乙個事務寫入時不受其他事務的影響。

鎖粒度:鎖定的資料量越少(粒度越小),併發程度越高,但相應的加鎖、檢測鎖、釋放鎖用的系統開銷也隨之增大。

鎖策略:鎖開銷與資料安全性之間的平衡

表鎖:鎖住整張表,讀鎖互不阻塞,寫鎖阻塞其他所有讀寫鎖(同一張表)。開銷最小。

行級鎖:對每一行資料(記錄)加鎖,開銷大,併發程度高。

innodb對死鎖的處理:此處死鎖與os死鎖類似,多個事務互相持有對方所有要申請資源的鎖不釋放,造成環路死鎖。mysql innodb引擎檢測到死鎖迴圈依賴後,回滾持有最少行級鎖的事務。

索引及其作用和實現方法:

概念:對資料庫表列進行增加恰當索引,可以快速的找到匹配的記錄行數,相比於預設的全表掃瞄,可以大大加快查詢的速度。

作用:加快查詢速度;

實現方法:一般分為b+樹索引和雜湊索引。

b+樹索引:在b-tree上改進得到,其非葉子節點均為key值,葉子節點是key-data鍵值對。葉子節點前後相連且有序。

雜湊索引:通過對key進行hash(crc/md5/sha1/sha256...)而將記錄儲存在不同的bucket種,可以做到常數時間的查詢,但要注意雜湊衝突的避免(鍊錶法、線性探測、二次探測、公共溢位區的方法)。其中md5 128位,和sha1/256碼都較長不太適合作為hash函式。預設無序。

為什麼有了b+樹索引還要hash索引?

b+樹預設有序,hash預設無序,所以雜湊索引無法用於排序;

雜湊索引o(1)在速度上毋庸置疑要快於b+樹近似o(logn);

雜湊索引只能進行等值查詢(因為他要計算hash(key)再去匹配)而b+樹索引可以進行等值、部分字首、範圍查詢;

底層實現結構不同:b+樹是非線性結構,hash桶是線性結構。

對於某些場景如熱點頁/活躍查詢頁,需要借助雜湊索引來實現快速查詢。

索引越多越快?

此言差矣,索引並非是虛無縹緲的,是實實在在的一種資料結構(b+樹/hash桶)要佔記憶體、維護它要系統開銷,一般的插入刪除都要進行結構的調整,這要消耗時間,所以索引太多反而拖慢查詢時間。有時候,見資料量不多時,建立索引還不如全表查詢。索引加快了檢索的速度,但是插入刪除修改都需要dbms動態更新內部索引結構,要耗費開銷。

innodb mvcc

多版本併發控制,是為了避免加鎖而實現的。一般的實現方法是儲存快照來實現的。innodb實現方式是在記錄後新增兩個隱藏列(表項),分別是事務建立時間、過期時間,儲存的實際上是系統版本號(系統版本號隨著事務的建立而遞增)。

這樣一來,insert 時加上開始版本號,update/delete時加上過期版本號,這樣一來在selete時,就只訪問開始系統版本號小於當前的事務的版本號、過期時間要麼未定義要麼在當前版本號之後的記錄,這樣就可以保證:訪問的記錄是在本事務開始前就存在而且在本事務期間沒有過期(被刪除或被修改過的)。可以避免髒讀、不可重複讀、幻讀的問題。(個人覺得)

mysql儲存引擎簡介

innodb,最為通用/推薦的一種引擎,支援事務、行級鎖、甚至間隙鎖(避免幻讀)、支援熱備份,mvcc,在併發上佔優勢,系統資源占用多。

myisam,預設的儲存引擎,不支援事務和行級鎖,只支援表鎖,某些場景效能很好:占用儲存上優,查詢速度上完勝(大概是innodb的3倍)系統資源占用少。

innodb支援事務, myisam不支援;

innodb支援行級鎖、表鎖;myisam只支援表鎖;

innodb支援mvcc,myisam不支援;

innodb不支援全文索引,myisam支援;

innodb支援外來鍵,myisam不支援外來鍵;

innodb和myisam都支援b+樹索引,innodb還支援自適應雜湊索引

myisam實現了字首壓縮技術,占用儲存空間更小(但會影響查詢),innodb是原始資料儲存,占用儲存更大。

ps:大部分情況下,innodb都是正確的選擇。---《高效能mysql》

sql優化

在經常性的檢索列上,建立必要索引,以加快搜尋速率,避免全表掃瞄(索引覆蓋掃瞄);

多次查詢同樣的資料,可以考慮快取該組資料;

審視select * form tables, 你需要所有列資料嗎?

切分查詢(大查詢切分成為小查詢,避免一次性鎖住大量資料)

分解關聯查詢(單錶查詢,結果在應用程式中進行關聯,可以減少處理過程中的鎖爭用)

盡量先做單錶查詢;

profile 的作用和用法

用於儲存sql語句執行狀態,需要手動開啟,才可以檢視。

手動備份MySQL資料庫 手動備份mysql資料庫

paths 檔案路徑 user 資料庫使用者名稱 pass 資料庫密碼 database 資料庫名 public static boolean backup string paths,string user,string pass,string database outstr sb.tostring...

MySQL資料庫高階SQL語句之MySQL儲存過程

create procedure 過程名 過程引數 過程體 過程引數 格式 in out lnoutj引數名 型別 mysql delimiter 將語句的結束符號從分號 臨時改為兩個 可以是自定義 mysql create procedure delete matches in p playern...

mysq資料庫再次理解

1.表中的一條記錄就是乙個object,object有很多屬性,對應表中的字段。object的屬性對應的值就是字段值 2.外來鍵是關聯表關係用的。表關係的確立只能通過外來鍵 但更高效的策略是,在資料庫中部設定任何外來鍵,只是在 中進行控制。不設定外來鍵是指不指定foreign key,但是外來鍵這個...