Создайте временную таблицу в MySQL с индексом из выбранного
У меня есть хранимая функция, где я использую временные таблицы. По соображениям производительности мне нужен индекс в этой таблице. К сожалению, я не могу использовать ALTER TABLE
, потому что это вызывает неявное коммитирование.
Поэтому я ищу синтаксис для добавления INDEX
для tempid
во время создания. Может ли кто-нибудь помочь?
CREATE TEMPORARY TABLE tmpLivecheck
(
tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM tblLivecheck_copy
WHERE tblLivecheck_copy.devId = did;
Ответы
Ответ 1
Я нашел ответ самостоятельно. Моя проблема заключалась в том, что я использую две временные таблицы для соединения и создаю вторую из первой. Но индекс не был скопирован во время создания...
CREATE TEMPORARY TABLE tmpLivecheck (tmpid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY
KEY(tmpid), INDEX(tmpid))
SELECT * FROM tblLivecheck_copy WHERE tblLivecheck_copy.devId = did;
CREATE TEMPORARY TABLE tmpLiveCheck2 (tmpid INTEGER NOT NULL, PRIMARY KEY(tmpid),
INDEX(tmpid))
SELECT * FROM tmpLivecheck;
... решил мою проблему.
Привет...
Ответ 2
Я долго боролся с правильным синтаксисом для CREATE TEMPORARY TABLE SELECT. Выяснив несколько вещей, я хотел поделиться ответами с остальной частью сообщества.
Основная информация об этом операторе доступна в следующих ссылках MySQL:
CREATE TABLE SELECT и CREATE TABLE.
Иногда это может быть сложным для интерпретации спецификации. Поскольку большинство людей лучше всего учатся в примерах, я расскажу, как я создал рабочее выражение, и как вы можете изменить его, чтобы работать на вас.
-
Добавить несколько индексов
Этот оператор показывает, как добавить несколько индексов (обратите внимание, что имена индексов - в нижнем регистре - являются необязательными):
CREATE TEMPORARY TABLE core.my_tmp_table
(INDEX my_index_name (tag, time), UNIQUE my_unique_index_name (order_number))
SELECT * FROM core.my_big_table
WHERE my_val = 1
-
Добавить новый первичный ключ:
CREATE TEMPORARY TABLE core.my_tmp_table
(PRIMARY KEY my_pkey (order_number),
INDEX cmpd_key (user_id, time))
SELECT * FROM core.my_big_table
-
Создать дополнительные столбцы
Вы можете создать новую таблицу с большим количеством столбцов, чем указано в инструкции SELECT. Укажите дополнительный столбец в определении таблицы. Столбцы, указанные в определении таблицы и не найденные в select, будут первыми столбцами в новой таблице, за которыми следуют столбцы, вставленные оператором SELECT.
CREATE TEMPORARY TABLE core.my_tmp_table
(my_new_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY my_pkey (my_new_id), INDEX my_unique_index_name (invoice_number))
SELECT * FROM core.my_big_table
-
Переопределение типов данных для столбцов с помощью SELECT
Вы можете переопределить тип данных для столбца SELECT. В приведенном ниже примере тег столбца является MEDIUMINT в core.my_big_table, и я переопределяю его на BIGINT в файле core.my_tmp_table.
CREATE TEMPORARY TABLE core.my_tmp_table
(tag BIGINT,
my_time DATETIME,
INDEX my_unique_index_name (tag) )
SELECT * FROM core.my_big_table
-
Расширенные определения полей при создании
Все обычные определения столбцов доступны, как при создании обычной таблицы. Пример:
CREATE TEMPORARY TABLE core.my_tmp_table
(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
value BIGINT UNSIGNED NOT NULL DEFAULT 0 UNIQUE,
location VARCHAR(20) DEFAULT "NEEDS TO BE SET",
country CHAR(2) DEFAULT "XX" COMMENT "Two-letter country code",
INDEX my_index_name (location))
ENGINE=MyISAM
SELECT * FROM core.my_big_table
Ответ 3
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement
Пример:
CREATE TEMPORARY TABLE IF NOT EXISTS mytable
(id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM;
INSERT IGNORE INTO mytable SELECT id FROM table WHERE xyz;