我很好奇MySQL的where ... in (...)语句是否删除了作为优化的副本。
例如,如果我使用子查询,使用DISTINCT删除重复项是否重要?
一个示例查询:
SELECT * FROM foo WHERE bar_id IN (
SELECT id FROM bar where user_id = 4
);子查询有可能返回重复的bar.id's。
MySQL查询优化是否使查询更好?
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(...)语句很容易优化重复的情况下。这些是我不确定的细节。
发布于 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的输出(它没有出现在常规的表格解释中)。你会看到这样的情况:
"transformation": {
"select#": 2,
"from": "IN (SELECT)",
"to": "semijoin",
"chosen": true
}https://dba.stackexchange.com/questions/233840
复制相似问题