查询正在执行的SQL的数据库名和表名
创建限制0.5个CPU和0.5G内存的MySQL容器
docker run -itd --name mysql --cpu-quota=50000 --memory 512M --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
创建person表
DROP TABLE IF EXISTS person;
CREATE TABLE person ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name varchar(10) ) ENGINE = InnoDB CHARSET = utf8mb4;
插入10w条记录
DROP PROCEDURE IF EXISTS init_person_data;
DELIMITER $
CREATE PROCEDURE init_person_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <=100000 DO
INSERT INTO person(name) VALUES(CONCAT(CAST(i AS char), 'abc'));
SET i = i+1;
END WHILE;
END $
DELIMITER ;
CALL init_person_data();
跑超慢SQL,耗时26分30秒左右
SELECT DISTINCT p1.name FROM person p1 LEFT JOIN person p2 ON p1.name = p2.name;
mysqld的CPU使用率接近50%
查看mysqld进程打开的业务数据库表文件
lsof -p 20241 | grep "/var/lib/mysql/" | grep -e "\.ibd" | grep -v "/var/lib/mysql/mysql"
test是数据库名字,person是表名字。
查看当前用户正在运行的线程(root可以看到所有)
show full processlist;
说明超慢SQL还没有执行结束。