mysql怎么看数据库执⾏语句_如何查看MySQL执⾏了什么语
句?
先讲⼀下我们问题的背景:
在使⽤⼀些ORM框架(例如hibernate mybatis等等),甚⾄在ORM框架基础上使⽤⼀些快速构建⼯具(⽐如mybatis的通⽤mapper⼯具mybatis-tk)的时候,由于我们对框架和⼯具的不熟悉,有时候在调试上就带来了很⼤的困难。
ORM的特点之⼀就是对我们应⽤层开发⼈员屏蔽SQL语⾔,例如对于本来的SQL语句select * from user where id = #{id},我们开发者只需要⽤⼀个selectByPrimaryKey(int id)⽅法就可以实现。
但在实际开发中,有时候我们可能会需要做⼀些错综复杂的查询,⽽不是像上例中如此简单。当我们使⽤⼀些⽅法,借助ORM来进⾏SQL 语⾔拼接的时候,就时常会导致不理想的拼接结果,致使最终查询结果不对甚⾄直接报错。
那么怎样解决这个问题呢?
可以想到的⼀个办法,我们去研究框架or⼯具的源码,看看它内部是如何做SQL拼接的……
好吧这太反⼈类了。
那我们还可以采⽤⼀种迂回的⽅式,就是跳过寻框架的SQL拼接逻辑,⽽是出它的SQL拼接结果。
那么怎么查看SQL拼接结果呢?
框架和⼯具显然是没有提供这种功能的,所以我们从MySQL⼊⼿。
MySQL有⼀个⽇志表,可以把历史中执⾏过哪些SQL语句存储起来。但是默认这个功能是不开启的,因为如果记录所有历史查询SQL语句的话存储量太⼤了。
需要调试的时候,我们来输⼊命令开启这个功能:
//⽇志开启(⽇志输出到表:al_log)
SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'ON';
然后我们可以调⽤我们的应⽤程序,由框架或⼯具拼接SQL语句并执⾏。
接下来打开我们mysql数据库中的general_log表,可以看到有这样⼀些信息。
(这⾥笔者使⽤的是navicat可视化⼯具。⽤命令⾏来查看也不影响)
我们看argument字段,点击⼀下,并单击“备注”,可以看到具体执⾏的SQL语句。
在这⾥,其实也就可以到我们的SQL拼接结果。有了结果,再回过头去检查我们的应⽤层代码是不是要做出⼀些修改,就能顺利许多。
最后,在调试结束后别忘记关掉这个⽇志功能,不然信息量太⼤:
简单的mysql语句
SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'OFF';
再补充⼀个⼩tip,如果你要清空general_log的话,要⽤以下语句:
truncate al_log;
这是因为在我们的⽇志表中不能加锁,⽽delete操作是需要加锁的,所以只能使⽤truncate。
(当然如果你硬要修改事务隔离级别也可以)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。