kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
[mysql] выбрать разные значения из таблицы
02.12.2006 23:47
|
|
|
Задача такая - надо выбрать из таблицы уникальные значения и записать их в другую таблицу. Проблема в том, что исходная таблица содержит 100млн записей и мускл выдает ошибку code: ERROR 126 (HY000): Incorrect key file for table '/var/tmp/#sql_d575_0.MYI'; try to repair it
при тривиальном способе переноса.
|
Чужой код - потемки (с) |
|
Robinzon
|
Дракоша
|
|
|
|
Рег.: 28.09.2003
|
Сообщений: 5510
|
|
Рейтинг: 2851
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
02.12.2006 23:54
|
|
|
Ну переноси по частям и проставляй признак "запись обработана".
|
|
|
kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: Robinzon]
02.12.2006 23:58
|
|
|
В ответ на:
Ну переноси по частям и проставляй признак "запись обработана".
В итоге должен быть набор уникальных записей. Как обеспечить уникальность при переносе по частям? Обрабатывать за 1 шаг 1 запись и сравнивать со всеми, что уже есть в таблице? Подозреваю, что это будет очень медленно.
|
Чужой код - потемки (с) |
|
Robinzon
|
Дракоша
|
|
|
|
Рег.: 28.09.2003
|
Сообщений: 5510
|
|
Рейтинг: 2851
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
03.12.2006 00:05
|
|
|
По какому-нибудь столбцу условием можешь разбить таблицу на части? Если да, то обрабатывай такими частями и проверяй, что таких записей еще нет в новой таблице. Если не можешь, то построчно и признак проставляй.
С такими большими таблицами не работал, там что банальный select distinct при инсерте не работает?
|
|
|
kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: Robinzon]
03.12.2006 00:16
|
|
|
Ну вот я же и написал, что ошибку выдает. Вначале думает часа 2, потом - выдает ошибку.
|
Чужой код - потемки (с) |
|
Robinzon
|
Дракоша
|
|
|
|
Рег.: 28.09.2003
|
Сообщений: 5510
|
|
Рейтинг: 2851
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
03.12.2006 00:21
|
|
|
Тогда частями. Напиши процедуру и вечерком запусти, к утру все сделает.
|
|
|
kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: Robinzon]
03.12.2006 00:32
|
|
|
Ну придется видимо так и поступить. К утру - оптимистично, оптимистично... Я когда переносил эту таблицу с другого сервака, она за ночь заполнялась только банальными инсертами, а тут будет много поиска. Но через неделю наверняка.
С такой процедурой пока не спешу, так что вопрос по-прежнему актуален.
|
Чужой код - потемки (с) |
|
Robinzon
|
Дракоша
|
|
|
|
Рег.: 28.09.2003
|
Сообщений: 5510
|
|
Рейтинг: 2851
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
03.12.2006 01:14
|
|
|
Наверняка в этой таблице процентов 70 данных уже неактуальны. Раз уж ты часто с этой таблицей возишься, не думал неактуальные данные в архивную таблицу переложить?
|
|
|
mmCleric
|
|
|
|
|
Рег.: 19.09.2004
|
Сообщений: 459
|
Из: Здесь
|
Рейтинг: 263
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
03.12.2006 03:04
|
|
|
1) Тебе надо ее починить, у тебя индекс побился. REPAIR TABLE в консоли mysql'я или myisamchk из shell'а. 2) Могу предложить сделать во второй таблице unique ключ, и переносить все-таки кусками. Хотя бы скорость сможешь оценить выполнения. 3) Такие большие объемы в MyISAM хранить страшновато. Лучше уж InnoDB, хотя конечно, все от специфики задачи зависит.
|
-Ofun |
|
kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: mmCleric]
03.12.2006 16:54
|
|
|
1) sql_d575_0.MYI - это как я понимаю временная таблица, которая автоматически создается когда я делаю select distinct. Поэтому как починить ее - непонятно. 2) насчет unique ключа - ну есть id записи, который уникален. Ну и что? Мне же все равно нужно при выборе конкретного занчения проверить его уникальность по всей таблице. Я просто не понимаю, как реализовать перенос по частям. Можно, как вариант сделать поле, которое содержит 1ю букву в том поле, которое должно быть уникально - тогла будет несколько групп записей, которые точно уникальны. Можно по ним переносить 3) опять таки. Исходные данные в myisam. Но глюк-то возникает при создании/обработке временной таблицы, которую непонятно как контролировать.
|
Чужой код - потемки (с) |
|
mmCleric
|
|
|
|
|
Рег.: 19.09.2004
|
Сообщений: 459
|
Из: Здесь
|
Рейтинг: 263
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: kdmitrie]
03.12.2006 17:00
|
|
|
1) Ага, точно, это я невнимательно посмотрел. 2) Нет, я имел в виду такое:
code:
> 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) Угу.
|
-Ofun |
|
kdmitrie
|
member
|
|
|
|
Рег.: 07.12.2005
|
Сообщений: 181
|
Из: нутри
|
Рейтинг: 35
|
|
Re: [mysql] выбрать разные значения из таблицы
[re: mmCleric]
03.12.2006 17:11
|
|
|
Да, во 2м пункте указан способ, который не может не работать. Если не по 1 млн. разбивать, а еще мельче, то когда-то начнет получаться. Спасибо.
|
Чужой код - потемки (с) |
|