Создайте временную таблицу в MySQL с индексом из выбранного

85

У меня есть сохраненная функция, в которой я использую временные таблицы. По соображениям производительности мне нужен индекс в этой таблице. К сожалению, я не могу использовать, 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;
солик
источник

Ответы:

230

Я долго боролся с правильным синтаксисом для CREATE TEMPORARY TABLE SELECT. Разобравшись в нескольких вещах, я хотел поделиться ответами с остальной частью сообщества.

Основная информация об утверждении доступна по следующим ссылкам MySQL:

СОЗДАТЬ ТАБЛИЦУ ВЫБРАТЬ и СОЗДАТЬ ТАБЛИЦУ .

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

  1. Добавить несколько индексов

    Этот оператор показывает, как добавить несколько индексов (обратите внимание, что имена индексов - в нижнем регистре - необязательны):

    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
    
  2. Добавьте новый первичный ключ :

    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
    
  3. Создать дополнительные столбцы

    Вы можете создать новую таблицу с большим количеством столбцов, чем указано в инструкции 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
    
  4. Переопределение типов данных для столбцов из 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
    
  5. Расширенные определения полей во время создания

    Все обычные определения столбцов доступны, как при создании обычной таблицы. Пример:

    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
    
ИванД
источник
6
Ты сделал мой день, это было действительно полезно!
BastiaanWW
7
Рискуя прозвучать как бесполезный комментарий «спасибо», я хочу, чтобы вы знали, что спасли мою добычу. Хотел бы я дать больше, чем просто голос "за". Временные таблицы с индексами могут быть объединены, чтобы обойти ограничение присоединения временной таблицы к самой себе, и, похоже, в моем случае индекс был необходим.
Plasmarob
13

Я нашел ответ самостоятельно. Моя проблема заключалась в том, что я использую две временные таблицы для соединения и создаю вторую из первой. Но при создании Индекс не копировался ...

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;

... решил мою проблему.

Приветствия...

солик
источник
5
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;
Аюш Билала
источник
@solick PRIMARY KEYвсегда индексируется.
ebyrob