檢視一個正在執行的sql的執行計劃(explain for connection processlist_id)
線上往往會出現如下這種情況
一條sql很慢,但是寫的太長了,沒辦法複製出來,但是想看他的執行計劃,怎麼辦呢?幸好MySQL5.7提供了額外的explain方法
| 25977372 | ashe | 111.111.1.111:41102 | ashe | Query | 2448 | updating | delete from ashe
WHERE CUSTOMER_ID IN
(
2656596635
,
26565 |
可以通過explain for connection來看這個執行緒的執行計劃
mysql> explain for connection 25977372\G
*************************** 1. row ***************************
id: 1
select_type: DELETE
table: ashe
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 106665797
filtered: 100.00
Extra: Using where
1 row in set (0.00 sec)
這個表的CUSTOMER_ID欄位是有索引的,可以看到,由於條件中的in條件太多,導致MySQL走全表掃描了。
mysql> show create table ashe\G
*************************** 1. row ***************************
Table: ashe
Create Table: CREATE TABLE `ashe` (
`CUSTOMER_ID` bigint(18) NOT NULL AUTO_INCREMENT,
`ACCT_ID` varchar(40) DEFAULT NULL ,
`NAME` varchar(255) DEFAULT NULL ,
`STATUS` int(2) DEFAULT NULL ,
`SCORE` int(6) DEFAULT NULL ,
`COMMENTS` varchar(400) DEFAULT NULL ,
`READONLY` int(1) DEFAULT NULL ,
`CHECK_TIME` timestamp NULL DEFAULT NULL ,
`CREATE_TIME` timestamp NULL DEFAULT '0000-00-00 00:00:00' ,
`UPDATE_TIME` timestamp NULL DEFAULT '0000-00-00 00:00:00' ,
`VALUE` longtext COMMENT 'JSON',
`MODIFIER` int(8) DEFAULT NULL ,
`GROUP_TYPE` int(1) DEFAULT NULL ,
`CERTIFICATE_NO` varchar(128) DEFAULT NULL ,
`PHONE` varchar(128) DEFAULT NULL ,
`DSNAME` varchar(100) DEFAULT NULL ,
`AUDIT_STATUS` int(1) DEFAULT '0' ,
PRIMARY KEY (`CUSTOMER_ID`),
KEY `index_accout` (`ACCT_ID`) USING BTREE,
KEY `index_cer` (`CERTIFICATE_NO`) USING BTREE,
KEY `index_phone` (`PHONE`) USING BTREE,
KEY `index_name` (`DSNAME`) USING BTREE,
KEY `index_time` (`CHECK_TIME`) USING BTREE,
KEY `index_time_score` (`CHECK_TIME`,`SCORE`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2808276116 DEFAULT CHARSET=utf8 KEY_BLOCK_SIZE=8
1 row in set (0.00 sec)
RD也是個人才,大概看了下in中的條件,如下,為毛要寫成in呢?
PROCESSLIST_INFO: delete from ashe
WHERE CUSTOMER_ID IN
(
2656596635
,
2656596636
,
2656596637
,
2656596639
,
2656596640
,
2656596641
,
2656596642
,
2656596643
,
2656596644
,
2656596645
,
2656596646
,
2656596647
,
2656596649
,
2656596650
,
2656596651
,
2656596652
,
2656596653
優化
可以將in的個數降低到100以內,或者直接單條刪除吧,不會很慢。
可以參照這篇 https://blog.csdn.net/sun_ashe/article/details/83378728
相關文章
- 如何檢視SQL的執行計劃SQL
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- mysql explain 執行計劃MySqlAI
- explain執行計劃分析AI
- mysql執行計劃explainMySqlAI
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- 檢視SQL執行計劃的幾種常用方法YQSQL
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- Oracle檢視執行計劃的命令Oracle
- Explain執行計劃詳解AI
- explain 查詢執行計劃AI
- 檢視 OceanBase 執行計劃
- mysql explain 執行計劃詳解MySqlAI
- 十六、Mysql之Explain執行計劃MySqlAI
- MySQL Explain執行計劃 - 詳解MySqlAI
- 達夢資料庫SQL執行計劃檢視方法資料庫SQL
- 執行計劃-2:檢視更多的資訊
- Oracle如何檢視真實執行計劃(一)Oracle
- Oracle執行計劃Explain Plan 如何使用OracleAI
- (4) MySQL中EXPLAIN執行計劃分析MySqlAI
- mysql調優之——執行計劃explainMySqlAI
- MongoDb學習之Explain執行計劃MongoDBAI
- 檢視正在執行的 Linux 系統版本Linux
- 怎樣停止一個正在執行的執行緒執行緒
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- 用 Explain 命令分析 MySQL 的 SQL 執行AIMySql
- Oracle sql執行計劃OracleSQL
- 微課sql最佳化(11) 、如何檢視執行計劃SQL
- MySQL explain執行計劃詳細解釋MySqlAI
- 檢視mysql執行狀態的一些sqlMySql
- [20190125]簡單快速檢視那些sql語句正在執行.txtSQL
- Hive底層原理:explain執行計劃詳解HiveAI
- 在Linux中,如何檢視所有正在執行的程序?Linux
- 如何在Linux中檢視所有正在執行的程式Linux
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- 【SQL_PLAN】Oracle 透過檢視sql_plan 格式化執行計劃SQLOracle
- 【Java面試】如何中斷一個正在執行的執行緒?Java面試執行緒
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle