Выбор дубликатов дает различное количество результатов для каждого запроса - PullRequest
3 голосов
/ 11 июля 2019

В настоящее время я пытаюсь удалить дубликаты строк в 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.

Я не уверен, какой другой код предложить, чтобы помочь ответить на этот вопрос, так как это единственный запрос, который я выполняю иЯ делаю это прямо в консоли.Я пытаюсь придумать, что могло бы объяснить это.Учитывая других проблем , которые у меня были с этой же базой данных, мне интересно, возможно ли, что что-то повреждено.

Редактировать: Я запустил 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, с использованием пакета memtest Linux и запуска memtest 15G 2 (система имеет 16 ГБ памяти, при этом доступно 15,4 и используется около 4,4. Это облачная машина, и я не могу загрузиться с Memtest, хотя я отправил запрос провайдеру, чтобы выяснить, могут ли они.
  • Включение общего журнала, в котором между запросами не выполнялось никаких других действий.
  • Использование OPTIMIZE TABLE.
  • Удаление и повторное добавление индекса.
  • Изменение обработчика таблиц на MyISAM из InnoDB, что, похоже, немного помогло, так как запрос теперь достигает максимального предела после нескольких запросов, но этовсе еще отскакивает от начальных нескольких запросов.

Ответы [ 2 ]

0 голосов
/ 17 июля 2019
POSSIBLE KEYS  |   KEY
NULL          |  NULL

Представляет, что когда вы выполняли группирование, вы не используете какой-либо индекс.Добавьте определенный индекс для этого столбца.

0 голосов
/ 15 июля 2019

Мое ограниченное знание mysql вызывает у меня чувство пауков в отношении столбцов типа TEXT, я думаю, что в столбцах типа TEXT размер хранилища по умолчанию в таблице равен 256, а остальной размер текста хранится в некоторых внутренних таблицах temp mysql.И поскольку свойство «max_allowed_packet» различно для клиента mysql и сервера mysql, я думаю, что существует вероятность того, что каждый раз, когда сервер mysql отправляет вам различное подмножество всего текста вашему клиенту и, следовательно, эта неоднозначность.

Вы должны иметь возможность увеличить свойство "max_allowed_packet" для вашего клиента mysql и проверить, действительно ли вы получаете согласованные результаты.

...