Mysql索引 事務隔離級別和優化

2021-08-16 16:46:13 字數 1546 閱讀 5714

1.mysql多索引最左字首原則

從前往後依次使用生效,如果中間某個索引沒有使用,那麼斷點前面的索引部分起作用,斷點後面的索引沒有起作用

select * from table where index1=? and index2=? and index3=?.... 這種三個索引順序使用中間沒有斷點,全部發揮作用;

select * from table where index1=? and index3=?... 這種情況下index2就是斷點,index1發揮了效果,index3沒有效果

select * from table where index2=? and index3=?... 這種情況下index1就是斷點,在index1後面的索引都沒有發揮作用,這種寫法聯合索引沒有發揮任何效果;

select * from table where index2=? and index1= and index3=? .... 這個跟第乙個一樣,全部發揮作用,index只要用上了就行,跟寫的順序無關

2.事務隔離級別

sql定義了四種隔離級別,指定了那些資料可以改變其他事務可見,那些資料改變其他事務不可見。低階別的隔離可支援更高的併發處理,同時占用的系統資源更少。【set global transaction isolation level read un commited】事務隔離級別,檢視事務show variables like 'tx_isolation'

1.read-uncommitted(讀取沒提交內容)髒讀所有事務都可以看到其他未提交事務的執行結果,首先開啟a,b事務,b事務執行了更新操作但未提交,a事務讀取了更新後資料,b回滾,a事務出現了髒讀。

2.read-committed(讀取提交內容),乙個事務從開始到提交前所做的任何改變都是不可見的。首先開啟ab兩個事務,在b事務更新並提交後,a事務讀取了更新後的資料。此時處於同一a事務中查詢出現了不同的查詢結果,即不可重複讀現象。

3.repeatable-read(可重讀)mysql預設事務隔離級別,能確保同一事務的多個例項在併發讀取資料時,會看到同樣的結果。理論上會導致另乙個問題:幻讀。例如第乙個事務對乙個表中的資料進行了修改,這種修改涉及了表中的全部資料行,同時第二個事務也修改了這個表中的資料,這種修改是向表中新增一條資料。那麼就會發生第乙個事務的使用者發現表中還有沒有修改的資料,innodb和falcon儲存引擎通過多版本併發控制解決了該問題:innodb通過為每個資料行新增兩個隱含值的方式來實現。這兩個隱含值記錄了行的建立時間,以及過期時間。每一行儲存事件發生時的系統版本號,每一次開始乙個新事務時版本號+1,每個查詢根據事務的版本號來查詢結果。

4.serializable(可序列化)這個是隔離級別最高的。通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題,是在每個讀的資料行加上共享鎖實現,在這個級別,可能會產生大量的超時現象和鎖競爭。

mysql鎖型別:共享鎖(範圍鎖),排他鎖(ab可同時獲取共享鎖,但是不能同時獲取排他鎖),意向鎖(鎖表)

mysql優化:資料庫物件索引可以改善資料檢索效能,但是會損失cud(插入、更新、刪除)效能,對於不經常查詢的表最好不要建索引;select 多表查詢通過explain 來檢查select執**況;不要執行select * 語句。

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...