我目前正在尝试删除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
。
使用MyISAM时EXPLAIN SELECT COLUMN, COUNT(*) FROM COLUMN GROUP BY COLUMN HAVING COUNT(*) > 1;
的输出:
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+---------------------------------+
| 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,正在使用约0.4。这是一台云计算机,我无法使用Memtest引导,尽管我已向提供商提出要求,以查看他们是否可以。OPTIMIZE TABLE
。答案 0 :(得分:0)
我对mysql的有限了解触发了我对TEXT类型列的幻想,我认为在TEXT类型列中,表中的默认存储大小为256,其余文本大小存储在某些内部临时mysql表中。并且由于mysql客户端和mysql服务器的“ max_allowed_packet”属性是不同的,所以我认为每当mysql服务器向您的客户端发送整个文本的不同子集时,就有这种可能性。
您应该能够为mysql客户端增加“ max_allowed_packet”属性,并验证您是否确实获得了一致的结果。
答案 1 :(得分:-1)
POSSIBLE KEYS | KEY
NULL | NULL
它表示执行分组依据时,您没有使用任何索引。 在该列上添加特定的索引。