Передать индекс во временную таблицу из обычной таблицы? - PullRequest
5 голосов
/ 19 июля 2010

Я создаю временную таблицу с запросом, подобным следующему:

CREATE TEMPORARY TABLE temp_table
SELECT * FROM regular_table
WHERE 1

Но у обычной таблицы есть индекс FULLTEXT для некоторых полей.Я пытаюсь выполнить поиск FULLTEXT по новой временной таблице, и я получаю сообщение об ошибке «Не удается найти индекс FULLTEXT, соответствующий списку столбцов ».Таким образом, очевидно, что индекс не копируется в новую таблицу.Есть ли способ заставить это?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 19 июля 2010

Вы можете использовать CREATE TEMPORARY TABLE temp_table LIKE regular_table, но это создаст все индексы, поэтому, когда вы сделаете INSERT INTO temp_table SELECT * FROM regular_table, индексы будут перестроены - что может занять много времени.

Или вы можете создать таблицу и впоследствии добавить индекс:

CREATE TEMPORARY TABLE temp_table
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz)
INSERT INTO temp_table SELECT * FROM regular_table

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

Вероятно, наиболее эффективным способом было бы создать временную таблицу, вставить все, затем построить индекс:

CREATE TEMPORARY TABLE temp_table
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz)
ALTER TABLE temp_table DISABLE KEYS
INSERT INTO temp_table SELECT * FROM regular_table
ALTER TABLE temp_table ENABLE KEYS

Опять же, вам придется дождаться построения индекса, за исключением того, что это произойдет в одном фрагменте с последним оператором ALTER.

2 голосов
/ 19 июля 2010

Временная таблица точно такая же, как и любая другая таблица, за исключением того, что она будет отброшена в конце сеанса. Единственный способ иметь те же индексы (из базы данных) - создать их в таблице, как и в любой другой таблице.

Теперь немного взломать. Вы можете скопировать физические файлы на диске под новым именем и получить клон таблицы с индексами, но я предполагаю, что вы делаете это в приложении, так что это может быть не очень практично.

...