【发布时间】:2019-11-24 23:03:05
【问题描述】:
我正在尝试
- 仅当另一个表 final_stock_etablissements(10M 记录)与“警报器”代码匹配时,才从表 final_stock_ul(4M 记录)中获取信息
- 将结果限制为 1000
- 在临时表中插入所有内容
以下代码非常慢(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
但是“SELECT”部分本身非常快(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 语句中添加了缺失的字段
【问题讨论】:
-
INSERT提到一栏;SELECT提到 2 列。请修复。 -
final_stock_etablissements 中可以有多个匹配的警报器吗? (我正在考虑使用
JOIN而不是EXISTS。) -
你有
INDEX(postal_code, siren)吗? -
@RickJames 是的,它们有很多可能的匹配项(“etablissement”是一个位置,“siren”是一个公司编号,因此它们可以是一个公司的多个位置)-是的,我添加了一个postal_code 和警报器上的复合索引,没有任何结果。仍然无法弄清楚为什么插入会这么慢
标签: mysql database-performance