首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL `where...in`语句--它是否删除重复项?

MySQL `where...in`语句--它是否删除重复项?
EN

Database Administration用户
提问于 2019-04-03 14:06:19
回答 1查看 600关注 0票数 1

我很好奇MySQL的where ... in (...)语句是否删除了作为优化的副本。

例如,如果我使用子查询,使用DISTINCT删除重复项是否重要?

一个示例查询:

代码语言:javascript
复制
SELECT * FROM foo WHERE bar_id IN (
    SELECT id FROM bar where user_id = 4
);

子查询有可能返回重复的bar.id's。

MySQL查询优化是否使查询更好?

代码语言:javascript
复制
SELECT * FROM foo WHERE bar_id IN (
    SELECT DISTINCT id FROM bar where user_id = 4
);

从我在bar表中有2.5mm行的数据库上进行的测试(在适合这样的查询时使用索引),结果时间大致相同(对于一个大的RDS实例,目前有大量的开销)。

我应该注意到,我希望得到的解释比“使用DISTINCT时子查询返回的结果更少,所以当然更好”,因为这忽略了MySQL的查询优化器。例如,DISTINCT可能使用更多的资源,因此总体速度较慢,特别是在where...in(...)语句很容易优化重复的情况下。这些是我不确定的细节。

EN

回答 1

Database Administration用户

发布于 2019-04-03 18:06:53

假设user_id不是PRIMARY KEY,那么MySQL将需要去复制子查询以应用正确的语义。这里不应该需要DISTINCT关键字,因为它不会改变语义。

MySQL实际上有多个用于删除重复项的策略:https://dev.mysql.com/doc/refman/8.0/en/subquery-optimization.html

要查看使用的策略,您需要粘贴来自EXPLAIN FORMAT=JSON的输出(它没有出现在常规的表格解释中)。你会看到这样的情况:

代码语言:javascript
复制
     "transformation": {
                   "select#": 2,
                   "from": "IN (SELECT)",
                   "to": "semijoin",
                   "chosen": true
                 }
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/233840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档