1.讀寫鎖:
讀鎖是共享的,多個執行緒可以同時讀取同乙個資源;寫鎖是排他的,寫鎖可以阻塞其他的讀鎖和寫鎖。
2.鎖粒度(即行鎖和表鎖級別):
表鎖: 當乙個執行緒正在對一張表進行(插入、刪除、更新等)前,需要先獲得寫鎖,這會阻塞其他執行緒對這張表的讀寫操作。
行級鎖: 當乙個執行緒在對一張表的某條資料進行(插入、刪除、更新等)前,需要先獲得表鎖寫鎖,和行鎖寫鎖,這會阻塞其他執行緒對這行資料的讀寫操作。
3.事務(即一組原子性的sql語句):
3.1 acid即(atomicity,consistency,isolation,durability):
原子性: 整個事務要不全部提交,要不全部回滾。
一致性: 事務只有commit和rollback兩種情況。
隔離性: 乙個事務所做的修改在最終提交以前,對其他事務是不可見的。
永續性: 一旦事務提交,則其所做的修改就會永遠的儲存在資料庫中。
3.2 隔離級別
read uncommitted(未提交讀): 其他事務可以讀到當前事務沒提交的寫操作。這也稱為髒讀(dirty read)。
read committed(提交讀): 其他事務不可以讀到當前事務未提交的寫操作。可能會出現一種情況,在乙個事務中的兩次相同的查詢語句得到的結果集不同。提交讀也稱為不可重複讀。
repeatable read(可重複讀): 可重複讀解決了髒讀問題。該級別保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。當時還是存在幻讀現象(當事務讀取乙個範圍內的記錄時,另乙個事務在這個範圍插入一批新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)的現象)
serializable(可序列化): 它通過強制事務序列執行,避免了前面說的幻讀的問題。
3.3 死鎖
innodb目前處理死鎖的方法是,將持有最少行級排他鎖的事務進行回滾
3.4 事務日誌
事務日誌可以提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時只需要修改其記憶體拷貝,再把該修改行為記錄到之在硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到硬碟。事務日誌持久後,記憶體中被修改的資料在後台可以慢慢地刷回到磁碟。
3.5 mysql中的事務
自動提交(autocommit): 如果不是顯式地開始乙個事務,則每個查詢都被當做乙個事務執行提交操作。
修改事務的隔離級別: set [session] transaction isolation level read committed;
myisam為非事務性儲存引擎
3.6 隱式和顯式鎖定
innodb採用的是兩階段鎖定協議(two-phase locking protocol)。在事務執行過程中,隨時都可以執行鎖定,鎖只有在執行commit或者rollback的時候才會釋放,並且所有的鎖是在同一是個被釋放。這裡的鎖定時隱式鎖定。
顯式鎖定即 lock tables 語句。
4 多版本併發控制(mvcc)(只相容read committed ; repeatable read)
mvcc的實現,是通過儲存資料在某個時間點的快照來實現的。也就是說,不管需要執行多長時間,每個事務看到的資料都是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻看到資料可能是不一樣的。
innodb的mvvc實現是在每行有兩個隱藏屬性(建立版本號和刪除版本號)
下面是repeatable read隔離級別下,mvcc具體是何如操作的:
select
innodb會根據以下兩個條件檢查每行記錄:
a. innodb只查詢版本早於當前事務版本的資料行(也就是,行的版本號小於或等於事務的系統版本號),這樣可以確保 事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過得。
b. 行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前被刪除。
insert
innodb為新插入的每一行儲存當前系統版本號作為行版本號。
delete
innodb為刪除的每一行儲存當前系統版本號作為刪除標誌
update
innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當前系統保本號到原來的行作為行刪除標識。
5 mysql的儲存引擎
row_format: 行的格式。對於myisam表,可選的值為dynamic、fixed或者compressed。dynamic的長度是可變的,一般包含可變長度的字段,如 varchar 或者 blob。fixed的行長度則是固定的,只包含固定長度的列,如char和integer。compressed的行則只在壓縮表中存在。
rows: 表中的行數。對於myisam和其他一些儲存引擎,該值是精確的,但對於innodb,該值是估計值。
5.2 innodb儲存引擎
innodb採用mvcc來支援高併發,並且實現了四個標準的隔離級別。其預設級別是repeatable read ,並且通過間隙(next-key locking)策略防止幻讀的出現。間隙鎖使得innodb不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,以防止幻影行的插入。
innodb是基於聚簇索引。聚簇索引對主鍵查詢有很高的效能。不過他的二級索引中必須包含主鍵列,所以主鍵列很大的話,其他索引都會很大。
5.3 myisam儲存引擎
myisam提供大量的特性,包括全文索引、壓縮、空間函式等,但myisam不支援事務和行級鎖,
5.4 修改儲存引擎 alter table mytable engine = innodb;
如果把一張innodb轉化myisam在轉會innodb會丟失外來鍵。
(主要測試mysql在機器的 各種壓力測試)
(看了一遍感覺沒多大用,略)
1 一些概率性的東西
1.1 效能及完成乙個場景所需要的時間度量 (表現在乙個sql的響應時間)
2 慢查詢日誌 (經過別人的基準測試,慢查詢日誌對磁碟i/o效能影響很小)
2.1 通過show variables like "%query%" 檢視慢查詢的long_query_time,和慢查詢日誌位址
2.2 通過long_query_time 來設定mysql 多長時間算『慢』的時間
3 show profile(效能剖析) (一般不用,代價還是有一丟丟)
3.1 show variables like "%profile%" 檢視關於profile的變數
3.2 通過set profiling = 1;開啟 profile
3.3 執行一次sql , 然後show profiles檢視效能剖析的sql
3.4 通過 show profile for query [query_id] 來檢視這個sql的各個部分的耗時
4 show [session][global] status (mysql 記錄的所有的計數器資訊,加上[session]為回話級別的計數器)
5 show processlist
第四章 schem與資料型別優化
1.選擇優化的資料型別
1.1 更小的通常更好 (timesamp 比 datetime 小一半,但是不支援時區)
2.2 簡單就好 (例如:用mysql內鍵的型別而不是字串來儲存日期型別,整型儲存ip)
2.3 避免使用null
null使得索引、索引統計、值比較 等都更為複雜
null列會使用更多的儲存空間
null列被索引時,每個索引記錄需要乙個額外的位元組
mysql常用知識點 mysql 常用知識點。
mysql u root p show databases show tables select from abc order by id limit 0,10 create database bbb exit mysqldump u root p game home backup.sql mysq...
二級mysql知識點 Mysql 知識點
1.死鎖回滾策略 死鎖發生時mysql會選擇行數少的事務進行回滾 2.鎖型別 共享鎖,排他鎖 行級鎖 innob record lock 鎖定單條記錄 gap lock 鎖定乙個範圍的記錄 但不包括記錄本身 next key lock 鎖定乙個範圍的記錄 並且包 含記錄本身 這是預設的鎖型別 更新操...
mysql 全面知識點 Mysql知識點整理
1 儲存引擎區別 myisam 不支援事物 僅支援表級鎖 支援b 樹索引 memory 不支援事物 僅支援表級鎖 支援b 樹和hash索引 innodb 支援事物 支援行級鎖 支援b 樹索引 2 鎖機制 myisam memory儲存引擎使用的是表級鎖,分別為表共享讀鎖和表獨佔寫鎖,顯示加鎖lock...