mysql - 性能,为什么JOIN比IN更快

标签 mysql sql

我尝试优化一些在不同表(包括数据)上执行大量查询的 PHP 代码。

其逻辑是根据街区 ID(s)从每个表中获取一些字段,具体取决于它是城市(很多街区 ID)还是特定街区。

例如,假设我有 10 个这种格式的表:

neighborhood_id     |     some_data_field

查询是这样的:

SELECT `some_data_field` 
FROM `table_name` AS `data_table` 
LEFT JOIN `neighborhoods_table` AS `neighborhoods` ON  `data_table`.`neighborhood_id' = `neighborhoods`.`neighborhood_id` 
WHERE `neighborhood`.`city_code` = SOME_ID

因为有大约 10 个这样的查询,所以我尝试通过从 10 个查询中删除联接来优化代码,并对 neighborhoods 表执行一个查询以获取所有邻域代码。

然后,在每个查询中,我对社区 ID 执行 WHERE IN

预期的结果是更好的性能,但事实证明并没有更好。

当我向服务器执行请求时,第一个查询需要 20 毫秒,第二个查询需要更多时间,第三个查询需要更多时间,依此类推。 (第二个和第三个查询大约需要 200 毫秒),但使用 JOIN 时,第一个查询需要 40 毫秒,但其余查询需要 20 毫秒到 30 毫秒。

请求中的第一个查询向我们展示了 where in 更快,但我假设 MYSQL 在处理 JOIN 时有一些缓存。

所以我想知道如何改进查询中的 where

编辑 我阅读了答案和评论,我明白我没有很好地解释为什么我有 10 个表,因为每个表都按属性分类。

例如,一张表包含按楼层列出的值、一张按房间列出的值以及一张按日期列出的值 因此不可能将所有表合并为一张表。

第二次编辑 我还是被误解了。
我不是每个表只有一个数据列,每个表都有自己的字段数量,一个表可以有 5 个字段,另一个表可以有 3 个字段。以及不同的数据类型或格式类型,可以是日期或金钱 此外,我在查询中对这些字段执行一些计算,有时它可以是AVG或加权平均值,在某些表中它只是纯选择。 此外,我按一个表中的某些字段执行分组,它可以按房间,在其他表中可以按楼层

最佳答案

For example, assume that I have 10 tables of this format:

这是您问题的基础。不要在多个表中存储相同的信息。将结果存储在单个表中,并让 MySQL 优化查询。

如果原始表包含“信息”(例如数据生成的月份),那么您可能需要将其作为附加列包含在内。

一旦数据位于单个表中,您就可以使用索引和分区来加速查询。

请注意,将数据存储在单个表中可能需要更改您的摄取流程 - 即插入数据而不是创建新表。但您的查询会更简单,并且您可以优化数据库。

至于哪个更快,INJOIN。两者都在幕后做着类似的事情。在某些情况下,其中之一更快,但两者都应该使用索引和分区(如果可用)。

关于mysql - 性能,为什么JOIN比IN更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308304/

相关文章:

java - Derby - java.sql.SQLException : Column 'table.column_name' not found

mysql - 我想在 mysql 中使用 Between 运算符,但工作不正常

sql - 查询逗号分隔的 id 到逗号分隔的值

java - postgresql 错误接近于 java

php - 如何查询 FLOAT 值?

mysql - 如何生成三列计数表?

Mysql 外键创建

mysql - 外键的 Doctrine 模式更新失败

php - "Error establishing a database connection"是什么意思

java - 插入sql默认值错误