1.mysql配置文件的默認加載順序
/etc/my.cnf > /etc/mysql/my.cnf > mysql安裝目錄/etc/my.cnf > ~/.my.cnf
後面讀到的文件會覆蓋前面的配置。
2.mysql參數修改
mysql參數分爲靜態參數和動態參數 在mysql運行中能夠對動態參數進行修改
SET |[global|session] system_var_name = expr
SET |[@@global.|@@session.]system_var_name = expr
3.表
1)在innodb中,表都是根據主鍵順序組織存放的,稱爲索引組織表。
2)分區表
a.range分區 行數據基於一個給定的連續區間的列值放入分區。
b.list分區 和range分區同樣,只是list分區面向的是離散的值
c.hash分區 根據用戶自定義表達式的返回值來進行分區,返回值不能爲負數
d.key分區 根據MySQL數據庫提供的散列函數進行分區
4.索引
1)InnoDB中常見的幾種索引
B+樹索引
全文索引
哈希索引
2)B+樹索引
a.B+樹索引 分爲彙集索引和輔助索引
b.彙集索引是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的即爲整張表的行記錄數據
c.輔助索引 葉子節點除了包含鍵值外還包含一個書籤,即相應行數據的彙集索引建。
經過輔助索引查找數據時,innodb引擎會遍歷輔助索引 找到指向主鍵索引的主鍵(書籤),而後查找主鍵索引查找到完整的行數據。
3)能夠經過show index from tablename 來查看索引情況
4)經過Cardinality能夠看到不重複數據的預估值
5)索引的使用
聯合索引 是指對錶上的多個列進行索引。
覆蓋索引 能夠從輔助索引中直接獲取到要查詢的數據,不須要再查詢彙集索引。
索引提示 index hint,顯示告訴優化器使用哪一個索引。
eg:select * from t USE INDEX(a) where a=1 and b=2; 建議使用索引
select * from t FORCE INDEX(a) where a=1 and b=2; 強制使用索引
5.鎖
1)InnoDB中鎖的類型
共享鎖(S)
排它鎖(X)
意向共享鎖(IS)
意向排它鎖(IX)
因爲InnoDB存儲引擎支持的是行級鎖,所以意向鎖實際上不會阻塞除全表掃描外的任何請求。
2)非一致性鎖定讀
InnoDB經過多版本控制MVCC的方法來讀取當前執行時間的數據。
即實際讀取的是undo段中快照數據。
3)一致性鎖定讀
能夠經過SELECT...FOR UPDATE來獲取X鎖
經過SELECT...LOCK IN SHARE MODE來獲取S鎖
4)行鎖的3種算法
Record Lock:單個行記錄上的鎖 [a]
Gap Lock:間隙鎖 包含下範圍 不包括記錄自己 (a,b)
Next-Key Lock 包含上範圍 包含記錄自己(c,a]
6.事物
1)ACID
原子性Atomicity
一致性Consistency
隔離性Isolation
持久性Durability
2)InnoDB支持扁平事務、帶有保存點的事務、鏈事務、分佈式事務。
3)事務日誌
經過redo(重作日誌)保證事務的原子性和持久性
undo保證事務的一致性 實現MVCC和事務回滾
binlog用來進行POINT-IN-TIME的恢復和主從複製replication環境的創建。
4)隱式提交的SQL語句
a.DDL語句 alert create drop truncate
b.用戶權限相關 create/rename/drop user、grant、revoke、set password
c.管理語句 ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、
OPTIMIZE TABLE、REPAIR TABLE.
5)分佈式事務
使用分佈式事務時、mysql的隔離級別必須設置爲serializable。
XA事務一般有一個或多個資源管理器(數據庫)、一個事務管理器和一個應用程序組成。
使用兩階段提交方式(2PC:Two-Phrase Commit)。
第一階段全部節點都開始準備、告訴事務管理器事務等待提交。
第二階段 事務管理器告訴資源管理器ROLLBACK或者COMMIT
7.其餘
緩存命中率計算
正常狀況下命中率不能低於99%、命中率太低應該考慮內存不足問題。
Show global status like 'innodb%read%'\G;mysql
Innodb_buffer_pool_reads: 表示從物理磁盤讀取頁的次數
Innodb_buffer_pool_read_ahead:預讀的次數
Innodb_buffer_pool_read_ahead_evicted:預讀的頁,可是沒有被讀取就從緩衝池中被替換的頁的數量,通常用來判斷預讀的效率。
Innodb_buffer_pool_read_requests:從緩衝池中讀取頁的次數。
Innodb_data_read:總共讀入的字節數。
Innodb_data_reads:發起讀取請求的次數,每次讀取可能須要讀取多少頁。算法
緩衝池命中率=innodb_buffer_pool_read_requests/(innodb_buffer_pool_read_requests+innodb_buffer_pool_read_ahead+innodb_buffer_pool_reads)sql
平均每次讀取的字節數=innodb_data_read/innodb_data reads;
數據庫