我正在尝试
以下代码 非常慢 (15秒):
DROP TABLE IF EXISTS temp_results ;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_results (
siren INT,
denomination VARCHAR(255)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 ;
INSERT INTO temp_results (
siren,
denomination
)
SELECT
ul.siren,
ul.denomination
FROM dw.final_stock_ul ul
WHERE
exists
(
SELECT 1
FROM dw.final_stock_etablissements s
WHERE code_postal = 69001
AND s.siren = ul.siren
)
LIMIT 1000
但是“选择”部分 本身非常快 (0.078秒):
SELECT
ul.siren,
ul.denomination
FROM dw.final_stock_ul ul
WHERE
exists
(
SELECT 1
FROM dw.final_stock_etablissements s
WHERE code_postal = 69001
AND s.siren = ul.siren
)
LIMIT 1000
INSERT如何比SELECT慢得多?
(仅可插入1000条记录)
编辑:在INSERT语句中添加了缺少的字段
答案 0 :(得分:0)
我找不到性能下降的答案:/
但是潜在的问题非常普遍,并记录在网上:
仅在匹配另一个表时列出项目
在大型表上,“ IF EXISTS”解决方案或“ WHERE IN”解决方案似乎很慢
最好的解决方案是使用JOIN (快得多)。
但是,如果您在第二张表中有多个匹配项,那么它并不能完全解决问题,因为结果是同一行中的行数会多次(LEFT JOIN only first row)
我找到的解决方案是:
答案 1 :(得分:0)
如果您要依靠复合索引来提高性能(在CREATE TABLE语句中不存在),请尝试使用InnoDB作为临时表的引擎,这可能会有所帮助(请参见Rick James的回答:{{3 }})...