【问题标题】:Insert into table from temporary table takes a long time从临时表插入表需要很长时间
【发布时间】:2011-06-06 10:11:16
【问题描述】:

早安,

我有一个包含 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 扩展的结果。索引后(我可能做错了?)。插入仍然需要很长时间

【问题讨论】:

    标签: sql mysql performance select insert


    【解决方案1】:

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

    INDEX(A,B,C);
    

    不同于

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

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2016-08-13
      • 2017-12-05
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多