如果在TRUNCATE和SELECT INTO之间发送查询,则无数据。使用MySQL innoDB

如果在TRUNCATE和SELECT INTO之间发送查询,则无数据。使用MySQL innoDB,mysql,stored-procedures,locking,innodb,truncate,Mysql,Stored Procedures,Locking,Innodb,Truncate,使用MySQL数据库时,我创建的存储过程和事件计时器出现问题。 我创建了一个空表,通过SELECT INTO从另一个表填充数据。 在填充之前,我会截断当前数据。它仅用于跟踪自当前日期起2个月内发生的日志条目 这将一个350k+的日志表转换为大约750个,这确实加快了报告查询的速度 问题是,如果客户机在TRUNCATE语句和SELECT INTO语句之间精确地发送查询(考虑到事件设置为每1分钟运行一次,这很有可能),则查询不会返回任何行 我已经研究了在运行此过程时锁定表上的读取,但是存储过程中不允

使用MySQL数据库时,我创建的存储过程和事件计时器出现问题。 我创建了一个空表,通过SELECT INTO从另一个表填充数据。 在填充之前,我会截断当前数据。它仅用于跟踪自当前日期起2个月内发生的日志条目

这将一个350k+的日志表转换为大约750个,这确实加快了报告查询的速度

问题是,如果客户机在TRUNCATE语句和SELECT INTO语句之间精确地发送查询(考虑到事件设置为每1分钟运行一次,这很有可能),则查询不会返回任何行

我已经研究了在运行此过程时锁定表上的读取,但是存储过程中不允许使用锁

有没有人能想出一个(最好)不需要改造的解决方案? 我真的需要在这里指出正确的方向

谢谢,
Max

我建议使用另一种方法,而不是截断表,然后选择它

您可以将新数据集选择到新表中。接下来,使用单个
RENAME
命令,将新表重命名为现有表,将现有表重命名为某个备份名称

RENAME TABLE existing_table TO backup_table, new_table TO existing_table;
这是一个单一的原子操作。。。因此,在清空数据之后,但在重新填充数据之前,客户端不可能读取数据

或者,您可以将您的
截断
更改为
删除
,然后将其与
选择一起包装到事务中

START TRANSACTION
    DELETE FROM YourTable;
    SELECT INTO YourTable...;
COMMIT

也许我在这里有点误解了这个问题,但是在插入数据的表上查询不是更有效吗?或者从该表查询视图?效率不高。查询是通过登录发送的,这意味着访问一个包含350k+记录的表需要花费大约6秒的时间。但是,将服务器端的表查询到特定日期范围的新表中,最终得到大约750条记录。查询较小的表要快得多。查询视图时会运行视图,因此不会真正加快速度。+1用于建议从
TRUNCATE
更改为
DELETE from
,因为
TRUNCATE TABLE
是DDL而不是DML。它将关闭当前事务并启动新事务(MySQL 5.0认证研究指南第418页:)非常感谢您的修复!由于该表少于1k条记录,所以从中删除与截断表的性能差别不大。两个好主意,我必须同时做,看哪一个最好。再次感谢迈克尔!