[mysql] выбрать разные значения из таблицы

ghytr00013

Задача такая - надо выбрать из таблицы уникальные значения и записать их в другую таблицу. Проблема в том, что исходная таблица содержит 100млн записей и мускл выдает ошибку
ERROR 126 (HY000): Incorrect key file for table '/var/tmp/#sql_d575_0.MYI'; try to repair it  
при тривиальном способе переноса.

Boris1980

Ну переноси по частям и проставляй признак "запись обработана".

ghytr00013

Ну переноси по частям и проставляй признак "запись обработана".
В итоге должен быть набор уникальных записей. Как обеспечить уникальность при переносе по частям? Обрабатывать за 1 шаг 1 запись и сравнивать со всеми, что уже есть в таблице? Подозреваю, что это будет очень медленно.

Boris1980

По какому-нибудь столбцу условием можешь разбить таблицу на части?
Если да, то обрабатывай такими частями и проверяй, что таких записей еще нет в новой таблице.
Если не можешь, то построчно и признак проставляй.
С такими большими таблицами не работал, там что банальный select distinct при инсерте не работает?

ghytr00013

Ну вот я же и написал, что ошибку выдает. Вначале думает часа 2, потом - выдает ошибку.

Boris1980

Тогда частями. Напиши процедуру и вечерком запусти, к утру все сделает.

ghytr00013

Ну придется видимо так и поступить. К утру - оптимистично, оптимистично... Я когда переносил эту таблицу с другого сервака, она за ночь заполнялась только банальными инсертами, а тут будет много поиска.
Но через неделю наверняка.
С такой процедурой пока не спешу, так что вопрос по-прежнему актуален.

Boris1980

Наверняка в этой таблице процентов 70 данных уже неактуальны.
Раз уж ты часто с этой таблицей возишься, не думал неактуальные данные в архивную таблицу переложить?

ermsoft

1) Тебе надо её починить, у тебя индекс побился. REPAIR TABLE в консоли mysql'я или myisamchk из shell'а.
2) Могу предложить сделать во второй таблице unique ключ, и переносить всё-таки кусками. Хотя бы скорость сможешь оценить выполнения.
3) Такие большие объёмы в MyISAM хранить страшновато. Лучше уж InnoDB, хотя конечно, всё от специфики задачи зависит.

ghytr00013

1) sql_d575_0.MYI - это как я понимаю временная таблица, которая автоматически создается когда я делаю select distinct. Поэтому как починить её - непонятно.
2) насчет unique ключа - ну есть id записи, который уникален. Ну и что? Мне же все равно нужно при выборе конкретного занчения проверить его уникальность по всей таблице. Я просто не понимаю, как реализовать перенос по частям.
Можно, как вариант сделать поле, которое содержит 1ю букву в том поле, которое должно быть уникально - тогла будет несколько групп записей, которые точно уникальны. Можно по ним переносить
3) опять таки. Исходные данные в myisam. Но глюк-то возникает при создании/обработке временной таблицы, которую непонятно как контролировать.

ermsoft

1) Ага, точно, это я невнимательно посмотрел.
2) Нет, я имел в виду такое:

> CREATE TABLE target LIKE source;
> ALTER TABLE target ADD UNIQUE(distinct_field);
> INSERT IGNORE target SELECT distinct_field FROM source WHERE id > step * 1000000 AND id <= (step + 1) * 1000000;

Последний пункт повторять по всем step от 0 до сколько потребуется.
3) Угу.

ghytr00013

Да, во 2м пункте указан способ, который не может не работать. Если не по 1 млн. разбивать, а еще мельче, то когда-то начнет получаться. Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: