? 特別推薦
innodb_buffer_pool_size
檢視系統變數
| variable_name | value |
| innodb_buffer_pool_chunk_size | 134217728(128m) |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_size | 536870912(512m) |
show engine innodb status\g;
buffer pool and memory
total large memory allocated 549715968 # innodb_buffer_pool_size 總大小
dictionary memory allocated 133466
buffer pool size 32768 # 可容納快取頁數
free buffers 31362 # 剩餘空閒快取頁
database pages 1359 # 代表lru鍊錶中的頁的數量,包含young和old兩個區域的節點數量
old database pages 521 # lru鍊錶old區域的節點數量
modified db pages 87 # 髒頁數量
pending reads 0
pending writes: lru 0, flush list 0, single page 0
pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
pages read 1171, created 188, written 717
32.52 reads/s, 7.33 creates/s, 32.24 writes/s
buffer pool hit rate 996 / 1000, # 命中率
young-****** rate 0 / 1000 not 0 / 1000
pages read ahead 0.00/s, evicted without access 0.00/s, random read ahead 0.00/s
lru len: 1359, unzip_lru len: 0
i/o sum[0]:cur[200], unzip sum[0]:cur[0]
innodb_log_file_size
mysql> show variables like '%innodb_log_file%';
| variable_name | value |
| innodb_log_file_size | 50331648(48m)|
| innodb_log_files_in_group | 2 |
innodb_log_file_size
該引數指定了每個 redo 日誌檔案的大小,在 mysql 5.7.25 這個版本中的預設值為 48mb,
innodb_log_files_in_group
該引數指定 redo 日誌檔案的個數,預設值為 2,最大值為 100。
sync_binlog
mysql> show variables like '%sync_binlog%';
| variable_name | value |
| sync_binlog | 200 |
sync_binlog=0 的時候,表示每次提交事務都只 write,不 fsync;
sync_binlog=1 的時候,表示每次提交事務都會執行 fsync;
sync_binlog=n(n>1) 的時候,表示每次提交事務都 write,但累積 n 個事務後才 fsync。
但是,將 sync_binlog 設定為 n,對應的風險是:如果主機發生異常重啟,會丟失最近 n 個事務的 binlog 日誌。
innodb_flush_log_at_trx_commit
mysql> show variables like '%innodb_flush_log_at_trx_commit%';
| variable_name | value |
| innodb_flush_log_at_trx_commit | 2 |
0:當該系統變數值為 0 時,表示在事務提交時不立即向磁碟中同步 redo 日誌,這個任務是交給後台執行緒做的。 這樣很明顯會加快請求處理速度,但是如果事務提交後伺服器掛了,後台執行緒沒有及時將 redo 日誌重新整理到磁碟,那麼該事務對頁面的修改會丟失。
1:當該系統變數值為 1 時,表示在事務提交時需要將 redo 日誌同步到磁碟,可以保證事務的永續性。1 也是 innodb_flush_log_at_trx_commit 的預設值。
2:當該系統變數值為 2 時,表示在事務提交時需要將 redo 日誌寫到作業系統的緩衝區中,但並不需要保證將日誌真正的重新整理到磁碟。 這種情況下如果資料庫掛了,作業系統沒掛的話,事務的永續性還是可以保證的,但是作業系統也掛了的話,那就不能保證永續性了。
sort_buffer_size
mysql> show variables like 'sort_buffer_size%';
| variable_name | value |
| sort_buffer_size | 262144 |
optimizer_trace 檢視完整的優化過程
# 開啟 optimizer_trace
set optimizer_trace = 'enabled=on';
select * from sys_log order by create_date;
select * from information_schema.optimizer_trace\g;
......省略
"filesort_summary": {
"rows": 30815,
"examined_rows": 30815,
"number_of_tmp_files": 8, # 表示排序過程中使用的臨時檔案數
"sort_buffer_size": 1048560,
"sort_mode": "" # 下面做說明
加大 sort_buffer_size 之後,再檢視下 optimizer_trace
......省略
"filesort_summary": {
"rows": 30815,
"examined_rows": 30815,
"number_of_tmp_files": 0, # 表示排序直接在記憶體中完成
"sort_buffer_size": 20971472,
"sort_mode": "" # 下面做說明
join_buffer_size
mysql> show variables like 'join_buffer_size%';
| variable_name | value |
| join_buffer_size | 262144 |
巢狀迴圈連線(nested-loop join)
驅動表只訪問一次,但被驅動表卻可能被多次訪問,訪問次數取決於對驅動表執行單錶查詢後的結果集中的記錄條數的連線執行方式稱之為巢狀迴圈連線(nested-loop join),這是最簡單,也是最笨拙的一種連線查詢演算法
基於塊的巢狀迴圈連線(block nested-loop join)
join buffer 就是執行連線查詢前申請的一塊固定大小的記憶體,先把若干條驅動表結果集中的記錄裝在這個 join
buffer 中,然後開始掃瞄被驅動表,每一條被驅動表的記錄一次性和 join
buffer 中的多條驅動表記錄做匹配,因為匹配的過程都是在記憶體中完成的
max_length_for_sort_data
mysql> show variables like 'max_length_for_sort_data%';
| variable_name | value |
| max_length_for_sort_data | 1024 |
max_length_for_sort_data,是 mysql
中專門控制用於排序的行資料的長度的乙個引數。它的意思是,如果單行的長度超過這個值,mysql 就認為單行太大,要換乙個演算法。
sort_mode
sort_key, rowid
這表明排序緩衝區(sort_buffer)只放入排序列和主鍵 id。按排序鍵值排序,主鍵 id 用於從表中讀取該行其他值(回表)。
sort_key, additional_fields
這表明排序緩衝區(sort_buffer)包含查詢所引用的排序鍵值和列。按排序鍵值排序,列值直接從其中讀取。
sort_key, packed_additional_fields
這表明排序過程中對字串做了緊湊處理,在排序過程中按照實際長度來分配空間。
改變查詢列數,再檢視下 optimizer_trace
set optimizer_trace = 'enabled=on';
select id,create_date,type from sys_log order by create_date;
select * from information_schema.optimizer_trace\g;
......省略
"filesort_summary": {
"rows": 30815,
"examined_rows": 30815,
"number_of_tmp_files": 0,
"sort_buffer_size": 20971440,
"sort_mode": "" # 注意看這裡
MySQL重要指令
c終止當前正在輸入的指令 如果提示符變成 或 說明引號未封閉,此時輸入任何指令都會被忽略,包括quit。應該先輸入乙個引號,再輸入指令。show create table table name 可以顯示 的詳細資訊,包括約束。describe table name 顯示 的樣式 如果查詢條件是不等於...
MySQL重要指令
c終止當前正在輸入的指令 如果提示符變成 或 說明引號未封閉,此時輸入任何指令都會被忽略,包括quit。應該先輸入乙個引號,再輸入指令。show create table table name 可以顯示 的詳細資訊,包括約束。describe table name 顯示 的樣式 如果查詢條件是不等於...
MySQL重要指令
c終止當前正在輸入的指令 如果提示符變成 或 說明引號未封閉,此時輸入任何指令都會被忽略,包括quit。應該先輸入乙個引號,再輸入指令。show create table table name 可以顯示 的詳細資訊,包括約束。describe table name 顯示 的樣式 如果查詢條件是不等於...