一尘不染

MYSQL“ IN”的性能

mysql

我分两个步骤运行MYSQL查询。首先,通过一个查询获取ID列表,然后使用第二个查询沿的方式检索这些ID的数据SELECT * FROM data WHERE id in (id1, id2 ...)。我知道这听起来很骇人听闻,但是由于查询非常复杂,我已经这样做了。第一个涉及许多几何和触发法,第二个涉及许多不同的联接。我确定它们可以在单个查询中编写,但是我的MYSQL不足以实现它。

这种方法有效,但是 感觉 不对。再加上我担心它不会扩展。目前,我正在10,000个记录的数据库上进行测试,并且在“ IN”子句(即IN (id1, id2 ... id400))中具有400个id,并且性能很好。但是,如果说有1,000,000条记录怎么办?

这种查询的性能瓶颈(速度,内存等)在哪里?任何有关如何重构这种查询的想法也很棒。(例如,如果值得在存储过程中投入使用)。


阅读 793

收藏
2020-05-17

共1个答案

一尘不染

从一定数量的记录开始,a上的IN谓词SELECT变得比常量列表上的谓词更快。

有关性能比较,请参阅我的博客中的这篇文章:

如果在IN子句中查询中使用的列已建立索引,如下所示:

SELECT  *
FROM    table1
WHERE   unindexed_column IN
        (
        SELECT  indexed_column
        FROM    table2
        )

,则此查询仅被优化为一个EXISTS(对于的每个记录仅使用一个条目table1

不幸的是,MySQL它不能执行任务HASH SEMI JOINMERGE SEMI JOIN效率更高(特别是如果两个列都已索引)。

2020-05-17