我分两个步骤运行MYSQL查询。首先,通过一个查询获取ID列表,然后使用第二个查询沿的方式检索这些ID的数据SELECT * FROM data WHERE id in (id1, id2 ...)。我知道这听起来很骇人听闻,但是由于查询非常复杂,我已经这样做了。第一个涉及许多几何和触发法,第二个涉及许多不同的联接。我确定它们可以在单个查询中编写,但是我的MYSQL不足以实现它。
SELECT * FROM data WHERE id in (id1, id2 ...)
这种方法有效,但是 感觉 不对。再加上我担心它不会扩展。目前,我正在10,000个记录的数据库上进行测试,并且在“ IN”子句(即IN (id1, id2 ... id400))中具有400个id,并且性能很好。但是,如果说有1,000,000条记录怎么办?
IN (id1, id2 ... id400)
这种查询的性能瓶颈(速度,内存等)在哪里?任何有关如何重构这种查询的想法也很棒。(例如,如果值得在存储过程中投入使用)。
从一定数量的记录开始,a上的IN谓词SELECT变得比常量列表上的谓词更快。
IN
SELECT
有关性能比较,请参阅我的博客中的这篇文章:
如果在IN子句中查询中使用的列已建立索引,如下所示:
SELECT * FROM table1 WHERE unindexed_column IN ( SELECT indexed_column FROM table2 )
,则此查询仅被优化为一个EXISTS(对于的每个记录仅使用一个条目table1)
EXISTS
table1
不幸的是,MySQL它不能执行任务HASH SEMI JOIN或MERGE SEMI JOIN效率更高(特别是如果两个列都已索引)。
MySQL
HASH SEMI JOIN
MERGE SEMI JOIN