mysql 怎么调试_Mysql sql 语句调试

一. 执行报错内容不是真实的报错内容

6a80dd1b29fe7a2423ea83955dae12c4.png

存储过程和关联的存储过程都不存在'value_1_'这个字段

可以使用navicat的命令窗口执行

0d60acb43fa3c22bf4da0d2849e95c6f.png

反馈出真实的报错原因

由于customer_po_no_ 变量设置了长度2000  ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加

IF LENGTH(customer_po_no_) >= 1950 THEN

LEAVE archive_loop;

end IF;

即可;

二. 没有报错但获取的游标没有全部执行完直接退出,提示执行成功

明明获取了游标,但就是只执行了几个,代码表面上看不出问题

f607647e6f30f77768f60add55e2a9a2.png

全部执行大概要一个小时,结果只执行了几秒,检查数据,发现只执行了前面几个;

这个时候,可以通过每执行一次,就更新或者插入数据到一张表里面,观察那张表的规律,看下执行到哪个位置游标就直接跳出整个循环

如:

6b294898a24e03779de0a507f46f3830.png

再尝试单独执行断开那个数据,观察有没有报错或者那个数据有什么特殊的

这个时由于 ****Diff() 那个存储过程里面有一个变量的设置为 varchar(200), 那个变量会接收GROUP_CONCAT(customer_po_no) 的数据;把修改成 varchar(20000)即可;

三. GROUP_CONCAT 的长度限制,以及完全找不到原因的报错

1. group_concat 默认长度时1024,

可以在my.ini 里面设置需要的长度,重启mysql

#group_concat 的长度

group_concat_max_len=102400;

也可以;

SET GLOBAL group_concat_max_len=102400;

SET SESSION group_concat_max_len=102400;

2. group_concat 是不可以直接使用limit 限制长度

如:

select GROUP_CONCAT(a) from a_tab limit 5;

获取的结果也是全部的;

需要套多一个select 在外面才可以使用

select GROUP_CONCAT(a SEPARATOR ',')

from (select c.a as a from a_tab c limit 5) t;

3. group_concat 不明原因提示超长,明明获取的数据是绝对不会超长的

将获取的变量强制格式转换为char 即可

select GROUP_CONCAT(CAST(a AS char) SEPARATOR ',')

from (select c.a as a from a_tab c limit 5) t;

四. 对于千万级别的数据,抽取数据的语句一定要使用索引

eb25ed1fd8ea1c18ce4fec65a9840eb9.png

04ffb16d6a6d69b25d51ccc034f53f31.png

虽然即使使用没有索引的也是在一秒之内,但对于复杂运作,数据量大的存储过程,的时候,本来一个小时可以完成执行,结果10多个小时也执行不下,误以为是死循环;

由于有索引的表是分开归档和没有归档,虽然获取数据要分开两次,还要条件判断执行,但整体效率比直接用没有中间表快很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值