ForJest
- свежая кровь
Создание индекса на таблицу с большим количеством записей. Обмен данными.
В общем ситуация.
Есть буфферная таблица
[sql]
CREATE TABLE buffer (
hash int(11) NOT NULL default '0',
word char(31) NOT NULL default ''
) TYPE=MyISAM;
[/sql]
В ней от 15 до 100 миллионов записей. 15 000 000 - 100 000 000 записей.
И есть "рабочая" таблица куда нужно добавить данные из буфферной
[sql]
CREATE TABLE hash_word (
hash int(11) NOT NULL default '0',
word char(31) NOT NULL default '',
PRIMARY KEY (hash),
UNIQUE KEY word (word)
) TYPE=MyISAM;
[/sql]
Отличается она, как видно из описания лишь наличием уникальных ключей. И в ней содержится гораздо меньшее количество записей - допустим до 500 000.
Буфферная таблица нужна, чтобы не тратить время на создание индекса в процессе работы - просто накопление данных.
--------------------------------------------
Теперь вопрос. Какой способ займёт меньше времени для добавления данных из таблицы buffer в таблицу hash_word?
1. Делаем
[sql]
INSERT INTO hash_word SELECT * FROM buffer;
[/sql]
2. Делаем
[sql]
ALTER TABLE hash_word DISABLE KEYS;
INSERT INTO hash_word SELECT * FROM buffer;
ALTER TABLE hash_word ENABLE KEYS;
[/sql]
3. Или, учитывая что hash_word содержит 1-6% данных от буфферной таблицы - просто подменим её.
[sql]
INSERT INTO buffer SELECT * FROM hash_word;
ALTER TABLE buffer ADD PRIMARY KEY (hash), ADD UNIQUE (word);
DROP TABLE hash_word;
ALTER TABLE buffer RENAME hash_word;
[/sql]
Кто что думает по этому поводу? Я слышал ещё способ какой-то через myisamchk хитрый, но не помню подробностей.
Поделитесь пожалуйста информацией.
В общем ситуация.
Есть буфферная таблица
[sql]
CREATE TABLE buffer (
hash int(11) NOT NULL default '0',
word char(31) NOT NULL default ''
) TYPE=MyISAM;
[/sql]
В ней от 15 до 100 миллионов записей. 15 000 000 - 100 000 000 записей.
И есть "рабочая" таблица куда нужно добавить данные из буфферной
[sql]
CREATE TABLE hash_word (
hash int(11) NOT NULL default '0',
word char(31) NOT NULL default '',
PRIMARY KEY (hash),
UNIQUE KEY word (word)
) TYPE=MyISAM;
[/sql]
Отличается она, как видно из описания лишь наличием уникальных ключей. И в ней содержится гораздо меньшее количество записей - допустим до 500 000.
Буфферная таблица нужна, чтобы не тратить время на создание индекса в процессе работы - просто накопление данных.
--------------------------------------------
Теперь вопрос. Какой способ займёт меньше времени для добавления данных из таблицы buffer в таблицу hash_word?
1. Делаем
[sql]
INSERT INTO hash_word SELECT * FROM buffer;
[/sql]
2. Делаем
[sql]
ALTER TABLE hash_word DISABLE KEYS;
INSERT INTO hash_word SELECT * FROM buffer;
ALTER TABLE hash_word ENABLE KEYS;
[/sql]
3. Или, учитывая что hash_word содержит 1-6% данных от буфферной таблицы - просто подменим её.
[sql]
INSERT INTO buffer SELECT * FROM hash_word;
ALTER TABLE buffer ADD PRIMARY KEY (hash), ADD UNIQUE (word);
DROP TABLE hash_word;
ALTER TABLE buffer RENAME hash_word;
[/sql]
Кто что думает по этому поводу? Я слышал ещё способ какой-то через myisamchk хитрый, но не помню подробностей.
Поделитесь пожалуйста информацией.