mysql 查詢子句:mysql
子查詢算法
隔離級別:sql
mysql默認級別:可重複讀session
1. select @@global.tx_isolation; 2. select @@session.tx_isolation; 3. set global transaction isolation level read committed; //全局的 4. set session transaction isolation level read committed; //當前會話
mvcc(Multi Version Concurrency Control):爲了實現快照讀(讀寫不衝突)併發
redo log: mysql將事務操做過程當中產生redo log,事務提交時flush到硬盤(順序的)mvc
1. 當主機崩潰重啓,能夠從redo log獲取日誌恢復
undo log: 事務操做過程當中,記錄修改的回滾操做,事務回滾能夠用上app
1. mysql根據 undo log 能夠回溯到某個版本,實現mvcc
innodb是以彙集索引組織數據的。數據行中包含rowid(主鍵id),還包括:函數
1. trx_id:最近修改的事務id 2. db_roll_ptr:指向undo分段中的undo log
當前讀:特殊的讀操做,須要加鎖:工具
行級鎖是鎖索引,的前提條件是要匹配索引,不然退化爲表鎖(鎖彙集索引);優化
死鎖的例子:
session1: select * from t1 where id=22 for update;
1. empty set
session2: select * from t1 where id=23 for update;
1. empty set
session1: insert into t1 values(22, ...);
1. 一直未返回
session:2 insert into t1 values(23, ...);
1. Error 1213 (40001): Deadlock found when trying to get lock; ...
分析:
1. 當在存在的行進行鎖的時候,mysql只有行鎖 2. 當對爲存在的行進行鎖的時候,mysql會鎖住一段範圍(gap鎖) 1. 範圍: 1. 上述例子(id22,23都不存在): 1. 假設以前表有id(11,12),鎖住的範圍:(12,無窮大) 2. 假設以前表有id(11,30),鎖住的範圍:(11,30) 3. 假設以前表有id(50,xxx),鎖住的範圍:(無窮小,50)
錶鏈接
笛卡爾積:A X B = { (a,b) | a ∈ A and b ∈ B }, (a,b) 叫作有序偶
1. 笛卡爾積的數量= num(A) * num(B)
不加任何規則的鏈接:select * from users,table2,結果是笛卡爾積
1. 若是帶了where語句,只篩選出對應表的符合記錄的行 2. 和不帶鏈接規則的 inner join一致
inner join:內鏈接,
1. 若是不帶鏈接規則和上面同樣,mysql中 cross join 和 inner join相似 2. 若是帶鏈接規則,結果爲笛卡爾積中去掉不知足鏈接規則的記錄 3. 鏈接規則的類型: 1. 等值 2. 不等值 3. 自鏈接(相同表不一樣字段)
外鏈接:
1. left join: 左表全 右表沒有就算null 2. right join:
聯合查詢: union
GTID複製:mysql5.6+
主從複製
索引:
聯合索引的匹配規則:最左原則
1. 不知足,可能出現兩個狀況: 1. 次級字段的全部記錄是有序的,此時explain中的type=index,表示掃描全index 2. 不是有序的,用不到索引
explain(關鍵字段):
1. select_type:查詢類型, 1. simple:通常是簡單查詢,不使用union或子查詢 2. subquery:子查詢中的第一個select 3. primary:最外層的select 2. type:mysql找到所需行的方式,又叫「訪問類型」,由差到好的順序: 1. type=ALL:全表掃描(通常須要進行優化) 2. type=index:整個索引掃描(不知足最左匹配可能會引發) 3. type=range:使用一個索引來檢索給定範圍的行 4. type=ref:mysql會根據特定的算法快速查找到某個符合條件的索引,而不是會對索引中每個數據都進行一一的掃描判斷 5. type=eq_ref:相似ref,區別是使用的索引是惟一索引 6. const、system:常量匹配,主鍵匹配 3. rows:找到所需記錄須要讀取的行數(估計值) 4. extra:詳細信息,常見: 1. Using index:只查詢索引就能獲得結果(覆蓋索引) 2. Using where:須要經過索引再檢索實際數據進行過濾 3. Using temporary:使用臨時表 4. Using filesort:使用臨時文件排序
null與索引的關係:
1. is null 是可使用索引的 2. is not null 不能 3. 但最好能不用null就不用
online ddl
通常狀況經過新建臨時表實現,參考:https://cloud.tencent.com/dev...
1. 新建臨時表爲最新的表結構,在業務低峯期加鎖拷貝數據到新表,rename舊錶和新表 2. 其餘實現: 1. Facebook工具pt-osc 經過觸發器同步變化數據 不鎖表 2. gh-ost,經過主從同步binlog方式
mysql5.6+支持在線online ddl
1. 但執行開始也須要一個短暫鎖表的過程,準備元數據 2. 分爲 inplace 和 copy 1. 添加字段 可能inplace 和 copy 但支持併發的dml 3. frm文件是表結構定義 4. mysiam: table.frm, table.MYD, table.MYI 5. innodb: table.frm, *.idb 6. innodb_file_per_table
其餘參考資料:
mysql加鎖處理分析
http://hedengcheng.com/?p=771
MySQL基於GTID的複製實現詳解
http://www.ywnds.com/?p=3898