Php MySQL行消失(神秘地)

Php MySQL行消失(神秘地),php,mysql,sql,phpmyadmin,innodb,Php,Mysql,Sql,Phpmyadmin,Innodb,我有3个表A、B和C,它们是直接链接的,应该包含相同数量的行,每个表的行一起创建 我最近注意到,在为测试目的创建了1000行(行肯定是插入的,没有事务,系统稳定),并且没有任何应用程序活动之后,似乎缺少了行。在几个小时的不活动后,每个表中的随机行数(0-50)(例如-30、-24、-7,各不相同)似乎丢失 这已经发生过好几次了,起初我没有注意到,但现在我是肯定的。没有任何代码包含从表(A/B/C)中删除之类的内容,因此我怀疑是否存在这样做的编码错误 当我注意到缺少行时,我正在使用phpMyAdm

我有3个表A、B和C,它们是直接链接的,应该包含相同数量的行,每个表的行一起创建

我最近注意到,在为测试目的创建了1000行(行肯定是插入的,没有事务,系统稳定),并且没有任何应用程序活动之后,似乎缺少了行。在几个小时的不活动后,每个表中的随机行数(0-50)(例如-30、-24、-7,各不相同)似乎丢失

这已经发生过好几次了,起初我没有注意到,但现在我是肯定的。没有任何代码包含从表(A/B/C)中删除之类的内容,因此我怀疑是否存在这样做的编码错误


当我注意到缺少行时,我正在使用phpMyAdmin,直接CLI查询证实了这一点。我确信我没有意外地通过GUI删除这些行。此外,这是在本地测试环境中进行的,因此没有(希望)公共访问

MySQL(限制设置)中是否有可能导致这种情况?这些不是不寻常的表格或行,每行10列,
CHAR
/
INT
/
ETC
。类型,每个表总计250kb

二进制日志文件是否会显示哪些行正在被删除,以及何时和由谁删除?配置日志记录有什么特殊注意事项吗

  • 语言是PHP,MySQL是InnoDB,WAMP,Windows,通过phpMyAdmin查看

您正在使用phpMyAdmin

如果表中有很多行,则表的预览会给出估计的行数,而不是实际的行数

试一试

看看是否真的有不同的行数


否则,您是否设置了任何触发器?或者innoDB存在任何完整性问题?

您使用的是phpMyAdmin

如果表中有很多行,则表的预览会给出估计的行数,而不是实际的行数

试一试

看看是否真的有不同的行数

否则,您是否设置了任何触发器?或innoDB的任何完整性问题?

代表OP发布:

斯泰尼的回答是正确的。我从未使用过1000行的表,并且假设MySQL将自己保持一个内部行计数。我还以为
showtable STATUS
会给我一个准确的计数,但这(我猜)也是phpMyAdmin用来呈现其主页的。行数相同的表会显示不同的近似值,这似乎很奇怪,因此我不知道近似值何时更新以及更新的频率。MySQL参考手册中的“InnoDB表的限制”部分提供了大部分内容

解决方案:使用
从表中选择COUNT(*)检索准确的行计数时,在查询StackOverflow之前,询问有关神奇和丢失记录的问题。同时阅读手册中的每一行。

代表OP发布:

斯泰尼的回答是正确的。我从未使用过1000行的表,并且假设MySQL将自己保持一个内部行计数。我还以为
showtable STATUS
会给我一个准确的计数,但这(我猜)也是phpMyAdmin用来呈现其主页的。行数相同的表会显示不同的近似值,这似乎很奇怪,因此我不知道近似值何时更新以及更新的频率。MySQL参考手册中的“InnoDB表的限制”部分提供了大部分内容


解决方案:使用
从表中选择COUNT(*)检索准确的行计数时,在查询StackOverflow之前,询问有关神奇和丢失记录的问题。还要阅读手册中的每一行。

魔法是不存在的。尝试在
mysql
客户端中做同样的事情。当我修复这个bug时,我将不再相信魔法。不知道你想让我做什么…在控制台客户端做你的删除或任何事情。检查结果。确保不是magicCan,我们可以看到创建行的代码吗?“direct CLI查询确认了这一点”。我希望您的意思是
从tablename
中选择COUNT(*)。服务器报告的表行数(例如,
显示表状态
)是InnoDB表的近似值。您需要澄清如何验证缺少行。魔法不存在。尝试在
mysql
客户端中做同样的事情。当我修复这个bug时,我将不再相信魔法。不知道你想让我做什么…在控制台客户端做你的删除或任何事情。检查结果。确保不是magicCan,我们可以看到创建行的代码吗?“direct CLI查询确认了这一点”。我希望您的意思是
从tablename
中选择COUNT(*)。服务器报告的表行数(例如,
显示表状态
)是InnoDB表的近似值。您需要澄清如何验证缺少行。非常感谢您,不再使用魔法。我很高兴像你这样的好人这么晚才起床。为我辩护:我确实注意到行数旁边的tilda(近似值)符号,这让我感到奇怪。我还使用ShowTableStatus来确认phpMyAdmin,我不知道这也是一个近似值。碰巧知道它开始接近多少行,多久更新一次?这里不是很晚,只是在这里吃了午饭。很高兴它能帮助你。几年前,这个问题也让我感到困惑。你无法真正知道noone是否告诉你~它在不知道5k行左右后开始近似,我不记得值,但只有在表中有足够的行之后才会这样做,这是正确的。只要注意“~”符号,如果它在那里的话,你可以数一数。非常感谢你,不要再施魔法了。我很高兴像你这样的好人这么晚才起床。为我辩护:我确实注意到行数旁边的tilda(近似值)符号,这让我感到奇怪。我还使用ShowTableStatus来确认phpMyAdmin,我不知道这也是一个近似值。碰巧知道它开始逼近多少行,多久更新一次?还不算太晚
SELECT COUNT(*) FROM tableA;
SELECT COUNT(*) FROM tableB;
SELECT COUNT(*) FROM tableC;