Utwórz tymczasową tabelę w MySQL z indeksem z wyboru


85

Mam zapisaną funkcję, w której używam tabel tymczasowych. Ze względu na wydajność potrzebuję indeksu w tej tabeli. Niestety nie mogę użyć, ALTER TABLEponieważ powoduje to niejawne zatwierdzenie.

Dlatego szukam składni do dodania INDEXfor tempidpodczas tworzenia. Czy ktoś może pomóc?

CREATE TEMPORARY TABLE tmpLivecheck 
(
    tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM   tblLivecheck_copy
WHERE  tblLivecheck_copy.devId = did;

Odpowiedzi:


230

Dość długo zmagałem się z właściwą składnią dla CREATE TEMPORARY TABLE SELECT. Po ustaleniu kilku rzeczy, chciałem podzielić się odpowiedziami z resztą społeczności.

Podstawowe informacje o wyciągu są dostępne pod następującymi linkami MySQL:

STWÓRZ WYBÓR TABELI i UTWÓRZ TABELĘ .

Czasami interpretacja specyfikacji może być zniechęcająca. Ponieważ większość ludzi uczy się najlepiej na przykładach, podzielę się tym, jak stworzyłem oświadczenie robocze i jak możesz je zmodyfikować, aby działało dla Ciebie.

  1. Dodaj wiele indeksów

    Ta instrukcja pokazuje, jak dodać wiele indeksów (zwróć uwagę, że nazwy indeksów - małymi literami - są opcjonalne):

    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. Dodaj nowy klucz podstawowy :

    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. Utwórz dodatkowe kolumny

    Możesz utworzyć nową tabelę z większą liczbą kolumn niż określono w instrukcji SELECT. Określ dodatkową kolumnę w definicji tabeli. Kolumny określone w definicji tabeli i nie znalezione w select będą pierwszymi kolumnami w nowej tabeli, po których nastąpią kolumny wstawione przez instrukcję 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. Przedefiniowanie typów danych dla kolumn z SELECT

    Możesz ponownie zdefiniować typ danych wybranej kolumny. W poniższym przykładzie tag kolumny to MEDIUMINT w core.my_big_table i przedefiniowuję go na BIGINT w 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. Zaawansowane definicje pól podczas tworzenia

    Wszystkie typowe definicje kolumn są dostępne tak, jak podczas tworzenia zwykłej tabeli. Przykład:

    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
Zrobiłeś mój dzień, to było naprawdę pomocne!
BastiaanWW,

7
Ryzykując, że zabrzmi to jak bezużyteczny komentarz „dziękuję”, chcę, żebyś wiedział, że uratowałeś mój łup. Żałuję, że nie mogę dać więcej, niż tylko zaopiekowanie się. Tabele tymczasowe z indeksami można łączyć w celu obejścia ograniczenia związanego z dołączaniem tabeli tymczasowej do samej siebie i wydaje się, że w moim przypadku indeks był niezbędny.
Plasmarob

13

Sam znalazłem odpowiedź. Mój problem polegał na tym, że używam dwóch tabel tymczasowych do łączenia i tworzę drugą z pierwszej. Ale indeks nie został skopiowany podczas tworzenia ...

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;

... rozwiązał mój problem.

Pozdrowienia...


5
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

Przykład:

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 KEYjest zawsze indeksowany.
ebyrob
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.