記錄一些MySQL的命令,包括一些查看和設置參數之類的命令。注意,這裏使用table_name代表的表名。例如表名是test,則將'table_name'替換成'test',將table_name替換成test。
1、設置隔離級別
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
1、範圍:
- session:會話級別,該設置只在當前會話中生效;
- global:全局,修改整個庫的配置。
2、級別:
- READ UNCOMMITTED:讀未提交,可以讀到其他事務沒有提及的數據,可能產生髒讀、不可重複讀、幻讀;
- READ COMMITTED:讀已提交,也叫不可重複讀。只會讀其他事務提交過的數據,但是如果事務處理過程中,其他事務修改並提交了本事務相關的數據,會出現前後兩次查詢查到不同數據的情況,即不可重複讀。可能產生不可重複讀、幻讀;
- REPEATABLE READ:可重複讀,MySQL的默認級別,不允許其他事務修改當前事務正在使用的行,所以不會出現不可重複讀的問題,但是可能產生幻讀。但是InnoDB通過MVCC(多版本併發控制)避免了幻讀的問題;
- SERIALIZABLE:串行化,強制要求全部事務串行執行,但是會導致非常嚴重的鎖爭用問題,併發性能極差。
2、查看錶狀態
SHOW TABLE STATUS LIKE 'table_name'
示例:show table status like 'vendor'
結果及字段說明:
字段名 | 字段值 | 說明 |
Name | vendor | 表名 |
Engine | InnoDB | 存儲引擎 |
Version | 10 | 版本 |
Row_format | Dynamic | 行的格式 |
Rows | 781 | 表中的行數 |
Avg_row_length | 608 | 平均每行的字節數 |
Data_length | 475136 | 表的數據大小,字節數 |
Max_data_length | 0 | 表數據的最大容量,和存儲引擎有關 |
Index_length | 0 | 索引的大小,字節數 |
Data_free | 4194304 | 已分配但未使用的行 |
Auto_increment | 4642 | 下一個auto_increment的值 |
Create_time | 31/10/2019 17:54:58 | 表創建時間 |
Update_time | 21/11/2019 18:53:15 | 表數據最新的更新時間 |
Check_time | 使用check table最後一次檢查的時間 | |
Collation | utf8_general_ci | 表的默認字符集和字符列排序規則 |
Checksum | 如果啓用,會保整個表的實時校驗和 | |
Create_options | 創建表時指定的其他選項 | |
Comment | 供應商基礎信息表 | 備註信息 |
3、轉換表的引擎
轉換表的存儲引擎的有2種常見方法:
1、直接修改:
ALTER TABLE table_name ENGINE = InnoDB;
2、導出數據,創建新表,導入數據:
創建新表時指定引擎:
CREATE TABLE `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
4、查看創建表的語句
SHOW CREATE TABLE table_name
5、慢查詢日誌
1、開啓慢查詢日誌:
SET PROFILING = 1;
2、查詢全部日誌:
SHOW PROFILES;
執行結果:
3、根據變化查詢特定查詢語句的詳情:
SHOW PROFILE FOR QUERY 5;
結果及部分說明:
Status | Duration | 字段說明 |
starting | 0.000142 | |
checking permissions | 0.000084 | 檢查權限;遍歷數據庫下所有的frm文件,並獲取相關信息 |
Opening tables | 0.000103 | 嘗試打開一個表。這個過程會很快,除非受到干擾,比如實際線程數遠高於表支持的併發數 |
init | 0.000101 | |
System lock | 0.000094 | 一個線程想請求或者正在等待一個表的內部或者外部的系統鎖 |
optimizing | 0.000085 | |
statistics | 0.000087 | |
preparing | 0.000093 | |
Creating tmp table | 0.000106 | 創建臨時表 |
Sorting result | 0.000083 | |
executing | 0.000255 | |
Sending data | 0.000141 | 從這個臨時表,把數據發送給用戶 |
Creating sort index | 0.000134 | |
end | 0.000084 | |
query end | 0.000083 | |
removing tmp table | 0.000087 | |
query end | 0.000089 | |
closing tables | 0.000081 | |
removing tmp table | 0.000082 | |
closing tables | 0.000081 | |
freeing items | 0.000095 | |
cleaning up | 0.000094 |
備註:可能還有些這個查詢不會涉及到的操作沒有展示出來,比如 Coping to tmp table。
4、查詢語句在其他方面的開銷
SHOW PROFILE ALL FOR QUERY 5;
SHOW PROFILE CPU FOR QUERY 5;
SHOW PROFILE BLOCK IO FOR QUERY 5;
ALL指的是顯示全部信息,這些信息包括:
- BLOCK IO 顯示塊IO相關開銷
- CONTEXT SWITCHES 上下文切換相關開銷
- CPU 顯示CPU相關開銷信息
- IPC 顯示發送和接收相關開銷信息
- MEMORY 顯示內存相關開銷信息
- PAGE FAULTS 顯示頁面錯誤相關開銷信息
- SOURCE 顯示和Source_function,Source_file,Source_line相關的開銷信息
- SWAPS 顯示交換次數相關開銷的信息
6、查詢計數器
1、查詢當前連接的會話級別的計數器:
SHOW STATUS;
2、查詢服務器級別的從服務啓動開始計時的計數器:
SHOW GLOBAL STATUS;
3、查詢特定的計數器:
SHOW STATUS WHERE Variable_name LIKE 'Com%';
SHOW STATUS LIKE 'Com%';
兩種寫法都可以。
show status大部分結果都是計數器,可以統計一些操作(例如讀索引)的頻繁程度,但是無法提供具體的時間。
4、常用的會話級操作:
SHOW STATUS WHERE Variable_name LIKE 'Handler%' OR Variable_name LIKE 'Created%';
結果:
Variable_name | Value |
Created_tmp_disk_tables | 0 |
Created_tmp_files | 25500 |
Created_tmp_tables | 0 |
Handler_commit | 0 |
Handler_delete | 0 |
Handler_discover | 0 |
Handler_external_lock | 0 |
Handler_mrr_init | 0 |
Handler_prepare | 0 |
Handler_read_first | 0 |
Handler_read_key | 0 |
Handler_read_last | 0 |
Handler_read_next | 0 |
Handler_read_prev | 0 |
Handler_read_rnd | 0 |
Handler_read_rnd_next | 0 |
Handler_rollback | 0 |
Handler_savepoint | 0 |
Handler_savepoint_rollback | 0 |
Handler_update | 0 |
Handler_write | 0 |
7、字符集和校對規則
1、查看字符集
show characterset;
2、查看校對規則
show collation;
3、設置字符集
CREATE TABLE my_table(id INT, name char(3)) DEFAULT CHARSET=utf-8;