我目前正在尝试删除 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 个查询来对结果进行抽样,结果如下:
上限 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_packet”属性不同,我认为每次 mysql 服务器向您的客户端发送整个文本的不同子集时,可能会出现这种歧义。
您应该能够为您的 mysql 客户端增加“max_allowed_packet”属性并验证您是否确实获得了一致的结果。
关于mysql - 选择重复项会为每个查询提供不同的结果计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56982039/