Mysql sql 语句调试

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

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

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

反馈出真实的报错缘由oop

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

IF LENGTH(customer_po_no_) >= 1950 THEN
                           LEAVE archive_loop;
end IF;

便可;code

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

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

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

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

如:class

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

这个时因为 ****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;

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

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

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

相关文章
相关标签/搜索