最近在學習極客時間上的mysql課程,對mysql資料庫有了更多了解,本篇文章是想總結一些mysql的基礎知識。目的是加深自己的記憶,也可以提升對mysql設計原理的了解。
關鍵字
名詞
transaction:事物
view:視圖
consistent read view:一致性視圖
redo log:重做日誌,物理日誌,記錄數據頁上做的什麼修改
binlog:歸檔日誌,邏輯日誌,記錄語句的原始邏輯,即sql語句
WAL:write ahead logging,更新數據時先寫redo log後寫磁碟
crash-safe:程序異常時不丟數據
B+樹:innodb的索引存儲方式,索引不僅存在內存,而且還存在磁碟
clustered index:聚簇索引,就是主鍵索引
secondary index:非主鍵索引,基於非主鍵索引查詢需要多查一次主鍵索引樹,即回表。
覆蓋索引:比如以一個索引為where條件查ID,這個索引樹上就有id,不需要查主鍵索引樹回表。
索引最左前綴:聯合索引最左面開始的n個字節優先索引
索引下推:聯合索引ab上可以優先判斷b是否滿足然後再去回表,提高效率,降低回表次數
前綴索引:不能用到覆蓋索引,即需要回表
頁分裂:插入數據時,索引上的數據頁滿了,需要新申請數據頁
Auto_Increment:自增主鍵,有序插入避免了頁分裂,提高效率降低空間使用率。
ACID:atomicity原子性,consistency一致性,isolation隔離性,durability持久性
dirty read:髒讀
non-repeatable read:不可重複讀
phantom read:幻讀
幻讀:同一個事物,前後兩次讀同一個範圍得到的結果不同,因為後一次有新插入導致。
read uncommited: 讀未提交
read commited:讀提交
repeatedable read:可重複讀
seraileable:串行化
當前讀:讀到所有數據的已經提交的最新值。
讀提交隔離級別的優勢:語句執行過程中加的行鎖,在語句執行完成後就把不滿足條件的鎖釋放了,不用等到事務提交,比可重複度和串行化更快。
過期讀:因為主從延遲導致讀的數據是舊的
短連結風暴:短連結太多導致mysql不可用
Dead Lock:死鎖
next-key lock:間隙所和行鎖一起Gap Lock:間隙鎖
全局鎖:Flush tables with read lock命令實現,整個資料庫只能讀
兩階段鎖:在提交事物後才釋放行鎖。因為鎖在最後釋放,所以如果鎖多行或者多個表的行,要把鎖衝突最大的放在最後。
排序算法:小數據量內存中快排,大數據外部排序歸併,還有order by limit小數據用堆排序(優先隊列)
io_thread:主備同步時備庫用來連接主庫的線程
sql_thread:執行日誌中的命令線程
雙M: 主備切換的結果
commit_id:一組事務裡一起提交的事務有相同的commit_id
frm:mysql表結構文件
ibd:mysql表數據文件
髒頁:內存數據和磁碟不一致的數據頁
刷髒頁:就是把內存中的數據刷到磁碟上
MVCC:資料庫的多版本並發控制
mysqldump:mysql官方自帶的邏輯備份工具
DML:增刪改數據
DLL:修改表結構
MDL:meta data lock元數據鎖,加MDL寫鎖時才能做修改欄位
DDL NOWAIT/WAIT n:在執行alter修改表結構時支持等待時間,對熱點表修改欄位有幫助。
快照:資料庫的當時狀況
低水位:每個事物啟動後和提交前活躍的事物列表裡最小的事物id
高水位:每個事物啟動後和提交前活躍的事物列表裡最大的事物id
net_buffer:網絡緩存區
socket send buffer:發送緩存區
socket receive buffer:客戶端接收緩存
mysql_store_result:客戶端把查詢結果緩存在本地
buffer pool: 輸入輸出緩存,能提高讀寫效率,命中率即內存命中率,越高越好
NLJ:Index Nested-Loop Join算法,效果最好
SNL:Simple Nested-Loop Join算法
BNL:Block Nested-Loop Join 算法,掃描過度儘量不用
join_buffer: join 的內存緩存
MRR:multi-range read,儘量順序讀盤
read_rnd_buffer:通過二級索引讀到id放到此緩存區
Index Organizied Table:索引組織表,innodb是把數據都放到B+樹即主鍵索引上
Heap Organizied Table:堆組織表,memory引擎數據單獨存儲,索引上保存數據的地址
參數
transaction-isolation:事物的隔離級別配置
innodb_lock_wait_timeout:死鎖等待超時時間,默認值50s,太長了。。。
innodb_deadlock_detect:死鎖檢測
transaction id:事物id
row trx_id:數據版本的事物id
undo log:回滾日誌
readonly: 只讀模式,從庫或者備庫
wait_timeout:mysql連接空閒超過一段時間後,mysql會斷開這個連接
max_connections:mysql的最大可接受連接數
sys.innodb_lock_waits: 顯示系統中的鎖狀態
binlog-checksum:用來校驗binlog是否完整
sort_buffer:排序需要的空間
number_of_tmp_files: 為排序準備的臨時文件數
OPTIMIZER_TRACE:mysql執行過程的跟蹤
Using temporary:explain執行接話結果,需要使用臨時表
Using filesort:explain執行接話結果,需要使用排序
binlog_format:mixed,row,statement
start-position:解析日誌開始的位置
seconds_behind_master:備庫延遲時間
slave_parallel_workers:主備同步的worker線程數
slave_skip_errors:主從同步時跳過錯誤
GTID : Global Transaction Identifie全局事務id
innodb_thread_concurrency:限制並發線程數,建議64到128
performance_schema:mysql一些統計表,包括磁碟利用率等
sql_safe_updates:mysql安全更新參數,delete時不加where條件或者沒有索引會報錯
query_cache_type: 查詢緩存類型
innodb_old_blocks_time:mysql的lru算法分old和young區,此參數用來控制時間閾值
long_query_time: 慢查詢日誌參數
cardinality:索引上不同值的個數基數,也就是區分度
innodb_io_capacity:磁碟的能力參數
innodb_flush_neighbors:刷髒頁是否刷鄰居頁參數
innodb_file_per_table:控制表數據放在共享表空間還是文件中,默認放在.ibd文件
change buffer: 資料庫更新的緩存,在內存中。唯一索引更新用不上
innodb_change_buffer_max_size:change buffer的大小,用buffer pool裡的內存
innodb_flush_log_at_trx_commit:每次事物的redolog是否直接持久化到磁碟
sync_binlog:每次事物的binglog是否持久化到磁碟
wait_timeout:客戶端如果太長時間沒動靜,連接器就會自動將它斷開,默認值是 8 小時。
rows_examined:你會在資料庫的慢查詢日誌中看到一個 的欄位,表示這個語句執行過程中掃描了多少行。這個值就是在執行器每次調用引擎獲取數據行的時候累加的。
net_buffer_length:網絡緩存區長度
join_buffer_size: join緩存區大小
read_rnd_buffer_size: read_rnd_buffer 大小
auto_increment_offset:自增id開始數字
auto_increment_increment:自增id步長
innodb_autoinc_lock_mode:表示語句結束才釋放鎖
命令
prepare: sql語句預處理
show slave status:返回備庫狀態
start slave:從庫開始同步主庫
force index(a):強制使用索引a
show index from t :查看表的索引
analyze table t: 重新統計索引信息
show variables:查看配置
show processlist :查看當前資料庫連接情況
SQL_CACHE:查詢緩存
kill connection:殺掉執行線程
join:如果被驅動表能用上索引,使用join比不使用要好,且要用小表做驅動
show create table:顯示建表語句
查詢優化
explain結果
有join時儘量在extra有Using MRR有join時儘量在extra中沒有BNLUsing index 用到覆蓋索引Using temporary用到臨時表,可能是內存也可能是磁碟,儘量不用Using filesort需要排序,儘量不用group by 時如果不需要結果排序,加上order by null,可以避免排序 如果對欄位用了函數就不能用索引不按照欄位類型查詢,將會用全索引掃描表的欄位字符集儘量統一,否則可能關聯時無法使用索引儘量不用查詢不需要的欄位,無端增加開銷