gpt4 book ai didi

mysql - 来自 MySQL 的不一致查询结果

转载 作者:IT王子 更新时间:2023-10-28 23:44:49 25 4
gpt4 key购买 nike

今天我们在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com