今天我们在 SQL 查询中发现了一个奇怪的行为(我们使用 MySQL v5.6.36 和 InnoDB)。
接受这个查询:
mysql> SELECT count(*) FROM `inventory` WHERE `user_id` = 12345;
它返回以下结果:
+----------+
| count(*) |
+----------+
| 495 |
+----------+
但是当运行以下查询时:
mysql> SELECT count(*) FROM `inventory` WHERE `user_id` = 12345 AND list_type = 3;
我们得到:
+----------+
| count(*) |
+----------+
| 1263 |
+----------+
如您所见,当查询受限时结果计数更大,这是不应该发生的。这可能是什么原因造成的?它只发生在主数据库中,而两个复制数据库都显示正确的结果。我们怀疑损坏的索引。将来如何防止此类错误?
除了 list_type
之外的任何其他条件也会返回无效(太高)计数。
最佳答案
不一致的结果可能意味着数据库损坏或(如果幸运的话)索引损坏。尝试在不使用索引的情况下启动上述查询,看看你会得到什么:
SELECT count(*) FROM `inventory` USE INDEX () WHERE `user_id` = 12345;
SELECT count(*) FROM `inventory` USE INDEX () WHERE `user_id` = 12345 AND list_type = 3;
如果这只是你可以尝试的索引
OPTIMIZE TABLE `inventory`;
它重新创建表和索引,然后对其进行 ANALYZE。那是因为 InnoDB 不支持 REPAIR TABLE。 另一种选择是尝试添加相同的索引,然后删除原始索引。
要对表执行检查,您也可以使用 CHECK TABLE,但如果您想检查整个数据库,您可以尝试
mysqlcheck --login-path=credentials --databases db_name
并优化所有表格
mysqlcheck --login-path=credentials --optimize --databases db_name
查看服务器的错误日志可能会提示您这是硬件问题还是遇到了一些 MySQL 错误。
如果您的实际数据库已损坏,检查硬件然后尝试通过与最近的备份比较来查看损坏的内容以及如何恢复它是有意义的。
关于mysql - 来自 MySQL 的不一致查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45480363/