mysql - 选择重复项会为每个查询提供不同的结果计数

标签 mysql ubuntu innodb mysql-connector

我目前正在尝试删除 MySQL 5.7 (InnoDB) 中的重复行,并检查我有多少重复项 mediumtext通过运行 SELECT COLUMN, COUNT(*) FROM TABLE GROUP BY COLUMN HAVING COUNT(*) > 1 列.最近返回的查询:

[results]
31620 rows in set (17.98 sec)

如果我稍后运行完全相同的查询,我会得到:

[results]
31594 rows in set (17.35 sec)

等等。我几乎每次都会得到不同的结果。查询期间没有任何内容写入数据库。 它仅针对此查询执行此操作SELECT COUNT(*) FROM TABLE , SELECT COUNT(*) FROM TABLE WHERE COLUMN LIKE <VALUE> , 等等,都会产生一致的结果。 执行SELECT COLUMN, COUNT(*) FROM TABLE GROUP BY COLUMN HAVING COUNT(*) > 0时也不会出现这个错误.

我不确定要提供哪些其他代码来帮助回答这个问题,因为这是我正在运行的唯一查询,而且我是在控制台中直接执行的。我在想可能是什么原因造成的。鉴于 other problems我已经使用过相同的数据库,我想知道是否有可能损坏了某些东西。

编辑:我运行了 1000 个查询来对结果进行抽样,结果如下:

enter image description here

上限 33991 是最常见的结果。

表格的字符集是utf8mb4 ,并且正在聚合的列的排序规则是 utf8mb4_general_ci .

EXPLAIN SELECT COLUMN, COUNT(*) FROM COLUMN GROUP BY COLUMN HAVING COUNT(*) > 1; 的输出在使用 MyISAM 时:

+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                           |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+
|  1 | SIMPLE      | TABLE  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 788685 |   100.00 | Using temporary; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+

InnoDB 的结果:

+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                           |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+
|  1 | SIMPLE      | TABLE  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 769501 |   100.00 | Using temporary; Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+

到目前为止,我已经按照评论中的建议尝试过:

  • 内存测试,使用 memtest Linux 包和运行 memtest 15G 2 (系统有 16G 内存,其中 15.4 可用,大约 .4 正在使用。这是一台云计算机,我无法使用 Memtest 启动,尽管我已经向提供商提出请求,看看他们是否可以。
  • 启用常规日志,它显示在查询之间没有运行其他事件。
  • 使用 OPTIMIZE TABLE .
  • 删除并重新添加索引。
  • 将表引擎从 InnoDB 更改为 MyISAM,这似乎有点帮助,因为查询现在在几次查询后达到了最大限制,但它仍然会在最初的几次查询中反弹。

最佳答案

我对 mysql 的有限了解触发了我对 TEXT 类型列的狡猾感觉,我认为在 TEXT 类型列中,表中的默认存储大小为 256,其余文本大小存储在一些内部临时 mysql 表中。由于 mysql 客户端和 mysql 服务器的“max_allowed_pa​​cket”属性不同,我认为每次 mysql 服务器向您的客户端发送整个文本的不同子集时,可能会出现这种歧义。

您应该能够为您的 mysql 客户端增加“max_allowed_pa​​cket”属性并验证您是否确实获得了一致的结果。

关于mysql - 选择重复项会为每个查询提供不同的结果计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56982039/

相关文章:

php - Laravel 中的 Mysql InnoDB 引擎

mysql - 如何索引 MySQL 中预先存在的数据?

javascript - Node js sql查询内连接

php - 我想创建新的博客站点

bash - 自动化 az 容器执行

php - 如何在 PHPMyAdmin 中启用 "Relation view"功能

java - 如何使用java代码将数据绑定(bind)到JTable

如果需要的话,MySQL 存储过程要 INSERT DELAYED 但先 CREATE TABLE 吗?

ubuntu - XAMPP 为 MariaDB 设置 root 用户密码

linux - Linux下如何查找占用磁盘空间的文件