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

标签 mysql sql

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

相关文章:

python - 无法使用输入作为名称在 Python 中创建 SQL 表

php - 开源的荣誉,在我的研究中

.net - 如何将 TransactionScope 与 MySql 和 Entity Framework 一起使用? (获取多个同时连接...当前不支持错误)

mysql - 仅搜索 MySQL IN 语句中的第一个元素

sql - 是否有任何规则或文档可用于 Oracle 数据库选择语句的列名的输出名称?

mysql自然排序给定数据

php - Eloquent 查询获取分组相关模型的计数

PHP - 从 MySQL 数据构建排行榜

php - 从表中获取多个值

mysql - 如何在数据库中实现这个逻辑?