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