show [session|global] status
: 查看服務器狀態
show global status like 'Com_'
: 查看各種語句的執行次數
開啟慢查詢: 在 MySQL 配置文件(/etc/my.cnf
)配置:
#開啟MySQL慢日志查詢開關
slow_query_log=1
#設置慢日志的時間為2秒,SQL語句執行時間超過2秒,就會視為慢查詢,記錄慢查詢日志
long_query_time=2
查看 SQL
的執行耗時:
#查看每一條SQL的耗時基本情況
show profiles; #查看指定query_id的SQL語句各個階段的耗時情況
show profile for query query_id; #查看指定query_id的SQL語句CPU的使用情況
show profile cpu for query query_id;
EXPLAIN 語句
EXPLAIN
: 獲取如何執行 SELECT
語句的信息
#直接在select語句之前加上關鍵字
explain / desc EXPLAIN SELECT 字段列表 FROM 表名 WHERE 條件 ;
EXPLAIN
執行計劃各字段含義:
-
Id:查詢的序列號,表示查詢中執行
select
子句或者操作表的順序 (id
相同,執行順序從上到下;id
不同,值越大,越先執行) -
select_type:表示
SELECT
的類型,常見的取值有SIMPLE
(簡單表,即不使用表連接或者子查詢)、PRIMARY
(主查詢,即外層的查詢)、UNION
(UNION
中的第二個或者后面的查詢語句)、SUBQUERY
(SELECT/WHERE
之后包含了子查詢)等 -
type:表示連接類型,性能由好到差的連接類型為 NULL、system、const、eq_ref、ref、range、index、all
-
possible_key:顯示可能應用在這張表上的索引,一個或多個
-
Key:實際使用的索引,如果為
NULL
則沒有使用索引 -
Key_len:表示索引中使用的字節數,該值為索引字段最大可能長度,并非實際使用長度,在不損失精確性的前提下,長度越短越好
-
rows:MySQL 認為必須要執行查詢的行數,在 innodb 引擎的表中,是一個估計值,可能并不總是準確的
-
filtered:表示返回結果的行數占需讀取行數的百分比,filtered 的值越大越好
索引使用規則
最左前綴法制:
指的是查詢從索引的最左列開始,不跳過索引中的列,如果跳躍某一列,后面的字段索引會失效
和查詢時放的列順序無關,存在即可,比如:
WHERE b = 2 AND a = 1 | 用到 a, b 列 | 數據庫會優化條件順序(a 在前),不影響 |
盡量使用 >=
而不是 >
, 這樣索引就不會失效
插入數據優化
- 插入數據時選擇批量插入:
Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
數據量大時可以選擇 load
指令:
#客戶端連接服務端時,加上參數 --local-infile
mysql --local-infile -u root -p#設置全局參數local_infile為1,開啟從本地加載文件導入數據的開關
set global local_infile = 1;#執行load指令將準備好的數據,加載到表結構中
load data local infile '/root/sql1.log' into table `tb_user` fields terminated by ',' lines terminated by '\n';
- 手動提交事務:
start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_test values(7,'Tom'),(8,'Cat'),(9,'Jerry');
commit;
主鍵設計原則:
- 滿足業務的情況下盡量降低
主鍵長度
- 插入數據時,盡量選擇順序插入,不要亂序, 性能更好, 選擇使用
AUTO_INCREMENT
自增主鍵 - 盡量不要使用
UUID
做主鍵或者是其他自然主鍵,如身份證號 - 業務操作時,不要對主鍵修改
order by 優化
-
Using filesort
:通過表的索引或全表掃描,讀取滿足條件的數據行,然后在排序緩沖區sort buffer
中完成排序操作,所有不是通過索引直接返回排序結果的排序都叫FileSort
排序 -
Using index
:通過有序索引順序掃描直接返回有序數據,這種情況即為using index
,不需要額外排序,操作效率高 -
根據排序字段建立合適的索引,多字段排序時,也遵循最左前綴法則
-
盡量使用覆蓋索引
-
多字段排序,一個升序一個降序,此時需要注意聯合索引在創建時的規則(
ASC/DESC
) -
如果不可避免的出現
filesort
,大數據量排序時,可以適當增大排序緩沖區大小 sort_buffer_size (默認 256k)
group by優化
分組操作時,索引的使用要滿足最左前綴法制,這樣的效率比較高
limit優化
通過覆蓋索引加子查詢形式進行優化
explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;
count優化
count ()
對于返回的結果集,一行行地判斷,如果參數不是NULL
,值加 1,否則不加,最后返回值- 用法:
count (*)、count (主鍵)、count (字段)、count (1)
效率 : count (字段) < count (主鍵) < count (1) ≈ count (*)
, 盡量使用 count(*)
update優化
執行更新時,更新的條件一定要有索引,而且這個索引不能失效,不然會從行鎖升級為表鎖,并發性能會降低