2011-01-10 142 views
1

上午乡亲,插入到从临时表的表需要较长时间

我有135000行24列,这些行的,我需要他们的约8000插入的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

回答

0

好的是,答案是正确的索引我的表,我不知道但是是

INDEX(A,B,C); 

是从

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

没有意识到你可以接受你自己的答案:p – ajacian81 2011-03-24 15:31:42