将巨大数据集放入 IN() 子句以提高性能的替代方法?

问题描述 投票:0回答:1

请查看以下查询:

SELECT cc.number_card
  FROM customers_cards cc
  JOIN customers_card_psp ccp
    ON cc.id = ccp.card_id
   AND ccp.psp_id = '12'
   AND ccp.status = 'old_ofogh_koorosh'
 WHERE cc.number_card IN ('5892101311148569',
                          '6104338967224862',
                          '5894631571684950', 
                          '5894631565301181',
                          '5894631115309510',
                          ...
                          ...
                          );

我使用 PHP 循环动态地将 ~5k

number_card
放入
IN(...)
子句中,然后执行查询。

问题是,它扫描的内容与

number_card
数字相同,而且有点非最佳。请参阅
EXPLAIN

enter image description here

知道如何重写查询以使其更加优化吗?

sql mysql performance in-clause
1个回答
0
投票

正如一些评论所建议的,一个好的解决方案可能是创建一个真正的表来包含 5K

number_card
值。然后,在
number_card
值上索引该新表以允许快速查找。但是,考虑到每个查询的 5K 值都会发生变化,这种方法将不起作用。

相反,我们可以专注于调整查询的其余部分,并保持您的方法不变。考虑添加以下索引:

CREATE INDEX idx1 ON customers_cards (id, number_card);
CREATE INDEX idx2 ON customers_card_psp (card_id, psp_id, status);

使用这两个索引中的哪一个取决于 MySQL 决定使用的查询计划,但是正如您所编写的那样,任何一个索引都应该加快整个查询的速度。

© www.soinside.com 2019 - 2024. All rights reserved.