使用EXPLAIN进行MYSQL存储过程调用

fly*_*sic 13 mysql stored-procedures

如何分析和使用EXPLAIN进行存储过程调用?我需要优化查询时间,但似乎没有我可以做EXPLAIN调用proc_name()?

小智 21

你可以试试

set profiling=1;
call proc_name();
show profiles;
Run Code Online (Sandbox Code Playgroud)

  • 这并没有揭示执行计划,但它确实显示了程序中每个查询花了多长时间. (2认同)

Jon*_*ack 9

目前你无法解释mysql中的存储过程 - 但你可以这样做:

drop procedure if exists get_user;
delimiter #
create procedure get_user
(
in p_user_id int unsigned,
in p_explain tinyint unsigned
)
begin
  if (p_explain) then
    explain select * from users where user_id = p_user_id;
  end if;
  select * from users where user_id = p_user_id;
end#

delimiter ;

call get_user(1,1);
Run Code Online (Sandbox Code Playgroud)


Fur*_*ane 3

MySQL 5.7 之前

EXPLAIN仅适用于SELECT语句,除非您使用EXPLAIN表名(它是以下语句的别名)DESCRIBE tablename

5.7之后:

EXPLAINSELECT DELETE INSERT REPLACE UPDATE与语句一起使用

  • 是的,这就是为什么它值得一提,所以其他读者是最新的,而不是坚持旧的过时的答案 (4认同)
  • `EXPLAIN` 与 `SELECT DELETE INSERT REPLACE UPDATE` 语句配合使用,如 [MySQL 5.7 doc](https://dev.mysql.com/doc/refman/5.7/en/explain.html) 中所述 (2认同)