从临时表插入表需要很长时间

时间:2011-01-10 09:21:53

标签: sql mysql performance select insert

早上的人,

我有一个包含135,000行和24列的临时表,我需要将这些行中的大约8,000行插入到8列表中。如果第一次运行我的插入(即当我的8列表为空时)它在大约6秒内运行。当我再次运行相同的查询时(这次它不应该插入任何东西,因为行已经插入),它需要30分钟!!

我一直无法用一个简单的小样本重新创建它,但是这里有一些sql供你运行。当程序表具有导致问题的条目时,它正在运行最后一次插入。任何人都可以解释为什么会这样吗?

CREATE TEMPORARY TABLE TVTEMPTABLE (
PROGTITLE TEXT,  YR YEAR, DIRECTOR TEXT, GENRE TEXT
);

CREATE TABLE GENRE (
GENREID INT NOT NULL AUTO_INCREMENT, GENRE TEXT, PRIMARY KEY(GENREID)
) ENGINE=INNODB;

CREATE TABLE PROGRAMME (
PROGRAMMEID INT NOT NULL AUTO_INCREMENT, GENREID INT NOT NULL, PROGTITLE TEXT, YR YEAR,
DIRECTOR TEXT, PRIMARY KEY(PROGRAMMEID), INDEX (GENREID), FOREIGN KEY (GENREID) REFERENCES GENRE(GENREID)
) ENGINE=INNODB;

INSERT INTO GENRE(GENRE) VALUES
('Consumer'),('Entertainment'),('Comedy'),('Film'),('Drama'),('Sport'),
('Sitcom'),('Travel'),('Documentary'),('Factual');

INSERT INTO TVTEMPTABLE(PROGTITLE, YR, DIRECTOR, GENRE) VALUES
('Breakfast','2011','n/a','Consumer'),('Breakfast','2011','n/a','Consumer'),
('Wanted Down Under','2011','n/a','Entertainment'),('Wanted Down Under','2011','n/a','Entertainment'),
('Lorraine','2011','n/a','Comedy'),('Lorraine','2011','n/a','Comedy'),
('Supernanny USA','2011','n/a','Film'),('Supernanny USA','2011','n/a','Film'),
('Three Coins in the Fountain','2011','n/a','Drama'),('Three Coins in the Fountain','2011','n/a','Drama'),
('The Wright Stuff','2011','n/a','Sport'),('The Wright Stuff','2011','n/a','Sport'),
('This Morning','2011','n/a','Sitcom'),('This Morning','2011','n/a','Sitcom'),
('Homes Under the Hammer','2011','n/a','Travel'),('Homes Under the Hammer','2011','n/a','Travel'),
('LazyTown','2011','n/a','Documentary'),('LazyTown','2011','n/a','Documentary'),
('Jeremy Kyle','2011','n/a','Factual'),('Jeremy Kyle','2011','n/a','Factual');

INSERT INTO PROGRAMME (
    PROGTITLE, GENREID, YR,
    DIRECTOR)
SELECT
    T.PROGTITLE, MAX(G.GENREID),
    MAX(T.YR), MAX(T.DIRECTOR)
FROM
    TVTEMPTABLE T
    INNER JOIN GENRE G ON G.GENRE=T.GENRE
    LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE    
WHERE P.PROGTITLE IS NULL
GROUP BY T.PROGTITLE;

编辑:这是索引的意思吗?

CREATE TEMPORARY TABLE TVTEMPTABLE (
PROGTITLE VARCHAR(50),  YR YEAR, DIRECTOR TEXT, GENRE VARCHAR(50), INDEX(PROGTITLE,GENRE)
);

CREATE TABLE PROGRAMME (
PROGRAMMEID INT NOT NULL AUTO_INCREMENT, GENREID INT NOT NULL, PROGTITLE VARCHAR(50), YR YEAR,
DIRECTOR TEXT, PRIMARY KEY(PROGRAMMEID), INDEX (GENREID,PROGTITLE), FOREIGN KEY (GENREID) REFERENCES GENRE(GENREID)
) ENGINE=INNODB;

编辑2:这是desc扩展的结果。索引后(我可能做错了吗?)。插入仍然需要很长时间

alt text

1 个答案:

答案 0 :(得分:0)

好的是答案是正确索引我的表格,但我没有意识到这是

INDEX(A,B,C);

不同
INDEX(A),INDEX(B),INDEX(C);