MySql“查看”,“准备好的声明”和“准备好的声明需要重新准备”

时间:2015-04-06 22:46:12

标签: mysql view prepared-statement

MySql存在问题,详情如下: 我创建了一个新的模式/数据库,只执行了这个查询:

create table mytable (
id varchar(50) not null,
name varchar(50) null default '',
primary key (id));

create view myview as
select id,name from mytable;

insert into mytable values ('1','aaa');
insert into mytable values ('2','bbb');
insert into mytable values ('3','ccc');

然后,如果我运行这些查询:

select * from mytable;
select * from myview;
prepare cmd from 'select id,name from mytable where id=?';
set @param1 = '2';
execute cmd using @param1;

查询给出正确的结果(3行,3行,1行)。

但是,如果我运行此查询,则存在问题:

prepare cmd from 'select id,name from myview where id=?';
set @param1 = '2';
execute cmd using @param1;

错误:#1615 - 准备好的声明需要重新准备

我做了一些研究,发现“以下”配置的增量可能会解决问题:

increase table_open_cache_instances value
increase table_open_cache value
increase table_definition_cache value

据我所知,上面的查询是常见的和标准的MySql查询,所以我认为语法没有问题。

我正在共享虚拟主机上,使用MySql版本是5.6.22

但令我困惑的是,它只包含1个架构/数据库,1个表有3个简短记录和1个视图, 我执行了一个通用的标准MySql选择查询, 真的需要增加上面的值吗? 是否有任何人有同样的问题增加了价值并真正解决了问题? 或者,您是否有任何其他解决方案,您认为可能或将会解决此问题?

ps:它不会在一天内发生一次或两次(假设由某些备份或相关引起),但在一整天(24小时)内发生。

谢谢。

2 个答案:

答案 0 :(得分:1)

每次执行后都会这样做吗?

deallocate prepare cmd;

答案 1 :(得分:0)

到目前为止最接近的猜测是服务器上的其他一些共享成员不能很好地编写代码(因为它是一个共享的虚拟主机),要么在执行大型选择时执行大的更改,要么在使用它之后不要释放已准备好的语句就像里克詹姆斯说的那样。 (想让帖子有用,但我没有声誉,对不起里克)

我无法确定" table_definition_cache"的增量会有效,因为系统管理员到目前为止仍然不会更改该值,但是如果您遇到同样的问题并且可以修改它,那么值得尝试。

我目前的解决方案是将查询字符串中的所有视图更改为非视图或子查询,它对我有用,但问题仍然存在。

例如。从

select myview.id, myview.name
from myview
inner join other_table on ...
where myview.id=?

select x.id, x.name
from (select id,name from mytable) x
inner join other_table on ...
where x.id=?