我在MySQL v.5.7.17(InnoDB,5.000行)上有这个示例表:
+-------+----------+
| code1 | code2 |
+-------+----------+
| 4714 | 15895510 |
| 1041 | 10000158 |
| 2866 | 10000000 |
(...)
代码1已编入索引
我用简单的查询进行测试:SELECT code2 FROM codes WHERE code1=1041
案例1:我在MySQL控制台上运行它并返回正确的值10000158
。
案例2:我从PHP( mysqli_query())运行它并且没有返回任何行( mysqli_num_rows()= 0 )。
如果我使用不同的代码1(WHERE code1=2866
)运行相同的查询,我会得到正确的结果:10000000
。
我一直在做很多测试,从来没有获得code1=1041
的行
最后,我运行了OPTIMIZE TABLE codes
,我从code1=1041
获得了正确的值!我很惊讶!
从控制台一直工作。从PHP中没有显示一些记录。 OPTIMIZE TABLE如何在PHP中解决这个问题?它可能是索引中的损坏并且只影响PHP-Mysqli引擎吗?
谢谢!
答案 0 :(得分:1)
我认为这是预期的(或至少非常可能的)行为。 OPTIMIZE TABLE对数据库和索引进行碎片整理。如果索引已损坏(甚至高度碎片化),此命令将修复它们。我最好的猜测是,在搜索该值时,您的高度分散的索引会超时,OPTIMIZE TABLE会修复该值。
阅读本文:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html 以及this question
的接受答案