- 今天学到了一个新函数的使用方法 ROW_NUMBER() 主要目的是给数据一个行号
原sql
SELECT pw.phid_worker, pw.phid_project, pw.phid_work_type FROM project_worker pw
INNER JOIN (
SELECT phid_worker, phid_project, MAX(entry_time) AS max_entry_time
FROM project_worker
GROUP BY phid_worker, phid_project
) pw2 ON pw.phid_worker = pw2.phid_worker
AND pw.phid_project = pw2.phid_project
AND pw.entry_time = pw2.max_entry_time
这样使用了子查询效率非常差
)
新sql:
SELECT phid_worker, phid_project, phid_work_type
FROM (
SELECT pw.*,
ROW_NUMBER() OVER (PARTITION BY phid_worker, phid_project ORDER BY entry_time DESC) AS row_num
FROM project_worker pw
) pw2
WHERE row_num = 1;
这样相当于按工人和项目分组之后按时间排序,取的是每个人每个项目最晚进场时间的一条。
- 当前发现服务器mysqld占用率为200%
SHOW PROCESSLIST可以查询到当前执行的查询列表
Id:连接线程的唯一标识符。
User:连接使用的 MySQL 用户名。
Host:连接的来源主机名或 IP 地址。
db:当前正在使用的数据库名。如果用户没有选择任何数据库,则该字段为 NULL。
Command:当前执行的 MySQL 命令类型,如 SLEEP, Query, Connect 等等。
Time:连接的持续时间,以秒为单位。如果是空闲连接,则该字段为 NULL。
State:查询状态。例如,如果正在进行排序,则此字段可能包含 “Sorting result” 等信息。
Info:MySQL 的当前查询或命令。如果用户没有发出任何命令,则该字段为空。
其中,Command 和 State 字段的值最为多样化。下面是常见的一些 Command 和 State 字段的含义:
Command 字段的常见值:
- Query: 表示当前正在执行 SQL 查询。
- Sleep: 表示当前连接正在等待新的请求。
- Connect: 表示当前连接正在连接 MySQL 服务器。
- Binlog Dump: 表示当前连接正在复制二进制日志。
State 字段的常见值:
- Sending data: 表示 MySQL 正在发送数据给客户端。
- Copying to tmp table: 表示 MySQL 正在将数据复制到临时表中。
- Sorting result: 表示 MySQL 正在对查询结果进行排序。
- Locked: 表示 MySQL 正在等待锁定。
- Waiting for table metadata lock: 表示 MySQL 正在等待表元数据锁
我们一般使用show processlist
- show processlist 如何批量清除进程
– 在navicate查询页面, 使用如下sql语句
select concat(“kill”, ID, “;”) as command
from information_schema.PROCESSLIST
where HOST regexp “some condtion”;
把结果复制执行即可