请查看以下查询:
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
:
知道如何重写查询以使其更加优化吗?
正如一些评论所建议的,一个好的解决方案可能是创建一个真正的表来包含 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 决定使用的查询计划,但是正如您所编写的那样,任何一个索引都应该加快整个查询的速度。