我有一個表imp_acc_act_itm包含大約3600萬條記錄,以下查詢運行速度非常快,并且在不到 5 毫秒的時間內僅從該表回傳21 條記錄
SELECT SKU
FROM imp_acc_act_itm AS ii
WHERE exists
(
SELECT 1
FROM acc_opr_rule_skus AS rs
WHERE rs.object IN (2006)
AND ii.sku = rs.value
);
現在,當嘗試將這些記錄插入另一個表或從中創建臨時表時,需要一分鐘以上才能完成:
CREATE TEMPORARY TABLE temp_table AS
SELECT SKU
FROM imp_acc_act_itm AS ii
WHERE exists
(
SELECT 1
FROM acc_opr_rule_skus AS rs
WHERE rs.object IN (2006)
AND ii.sku = rs.value
);
有人對此有解釋嗎?
請注意,我將 MariaDB-10.3.14 與 InnoDB 引擎一起使用。這是選擇查詢的解釋:
-------- ------------- -------- ------ ------------- -------------------------------------------------- ----- -------------- --------- ------ --------------- ------ -------------- | 編號 | 選擇型別 | 表| 型別 | 可能的鍵 | 關鍵 | key_len | 參考 | 行 | 額外 | -------- ------------- -------- ------ ------------- -------------------------------------------------- ----- -------------- --------- ------ --------------- ------ -------------- | 1 | 初級 | rs | 參考 | PRIMARY,FK__acc_opr_rule_skus__object,FK__acc_opr_rule_skus__value | 初級 | 4 | 常量 | 1 | 使用索引 | | 1 | 初級 | 二 | 參考 | FK__imp_acc_act_itm__sku | FK__imp_acc_act_itm__sku | 4 | eshop_fadel.rs.value | 238 | 使用索引 | -------- ------------- -------- ------ ------------- -------------------------------------------------- ----- -------------- --------- ------ --------------- ------ --------------
uj5u.com熱心網友回復:
我看不出是什么讓它變慢了,但這可能是一種解決方法:
CREATE TEMPORARY TABLE temp_table (SKU ...);
INSERT INTO temp_table
SELECT SKU
FROM imp_acc_act_itm AS ii
WHERE exists
(
SELECT 1
FROM acc_opr_rule_skus AS rs
WHERE rs.object IN (2006)
AND ii.sku = rs.value
);
另一個想法是轉身SELECT:
SELECT rs.value AS SKU
FROM ( SELECT DISTINCT value
FROM acc_opr_rule_skus
WHERE rs.object IN (2006) ) AS rs
JOIN imp_acc_act_itm AS ii ON ii.sku = rs.value
那時,這些索引可能會有很大幫助:
acc_opr_rule_skus: INDEX(object, value)
imp_acc_act_itm: INDEX(SKU) -- unless it is the `PRIMARY KEY`
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/428862.html
標籤:mysql
