Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание таблицы на данных другой. 81268312 записей 
:(
    Опции темы
nIkTo
Дата 18.10.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Столкнулся с проблемой создания одной таблицы на данных другой. На основании `table1` надо создать `table2`. Вот структура:

Код

create table `table1` (
  `row_id` int unsigned not null auto_increment,
  `row_name` char(100) not null,
  `other_row` char(15) not null,
  primary key (`row_id`)
);
create table `table2` (
  `row_id` int unsigned not null auto_increment,
  `row_name` char(100) not null,
  `row_crc32` int unsigned not null,
  `row_status` tinyint(1) unsigned not null,
  primary key (`row_id`),
  unique key (`row_crc32`),
  index (`row_status`)
);


В `table2` поле `row_crc32` должна располагаться crc32(`row_name`).
В таблице `table1` размещено 81,268,312 записей примерный размер таблицы 27.3 ГБ

Подскажите как "дешевле" создать и заполнить таблицу `table2`, основанную на данных из `table1`.
PM   Вверх
Akina
Дата 18.10.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

insert into ... select ...
а потом 
Код

alter table ... create key ...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nIkTo
Дата 19.10.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Akina, да сделал так:
Создал таблицу :
Код

create table `table2` (
  `row_id` int unsigned not null auto_increment,
  `row_name` char(100) not null,
  `row_crc32` int unsigned not null,
  `row_status` tinyint(1) unsigned not null default 0,
  primary key (`row_id`),
  unique key (`row_crc32`),
  index (`row_status`)
);


Заполнение :
Код

insert ignore into `table2`(`row_name`, `row_crc32`) select `row_name`, crc32(`row_name`) from `table1`;


Выполняется уже около 17 часов, посмотрел файл *.MYD таблицы, пока весит 11G, а исходный 27G, то есть если прикинуть то это минимум ещё сутки  smile  , а скорее всего что и того больше, так как новая таблица содержит больше полей, то есть и вес у неё будет больше исходной таблицы. Как ускорить процесс ? Или может есть какой-нибудь другой хитрый метод ?
PM   Вверх
Akina
Дата 19.10.2010, 10:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Русским же по белому сказал - сначала перелить данные в таблицу без индексов, потом проиндексировать!

Добавлено через 3 минуты и 26 секунд
Попробуй вообще шлёпнуть целевую таблицу, затем create table ... select ..., а потом создать ключи/индексы и изменить другие свойства.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nIkTo
Дата 19.10.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Akina, поставил запрос на выполнение ещё до того как вы ответили  smile 

если правильно понял то нужно сделать так :

1. Создаем таблицу.
Код

create table `table2` (
  `row_id` int unsigned not null auto_increment,
  `row_name` char(100) not null,
  `row_crc32` int unsigned not null,
  `row_status` tinyint(1) unsigned not null default 0
);


2. Заливаем данные.
Код

insert ignore into `table2`(`row_name`, `row_crc32`) select `row_name`, crc32(`row_name`) from `table1`;


3. Создаём индексы и ключи.
Код

alter ignore table `table2` add primary key (`row_id`), add unique key (`row_crc32`), add index (`row_status`);


Это сообщение отредактировал(а) nIkTo - 19.10.2010, 10:50
PM   Вверх
Akina
Дата 19.10.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



А можно даже так:
Создаём таблицу и сразу заливаем в неё данные
Код

create table table2 
select `row_name`, crc32(`row_name`) `row_crc32`
from table1

А затем добавляем поля, создаём ключ и индексы, задаём автоинкремент и пр. серией запросов alter table.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.