性能,为什么JOIN比IN

时间:2019-01-22 12:26:28

标签: 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毫秒。

请求中的第一个查询告诉我们in更快,但是我认为MYSQL在处理JOIN时有一些缓存。

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

EDIT 我读了答案和评论,我理解我并没有很好地解释为什么我有10个表,因为每个表都是按属性分类的。

例如,一张表包含楼层值,一个包含房间值,另一个包含日期 因此无法将union all个表变成一个表。

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

1 个答案:

答案 0 :(得分:2)

  

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

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

如果原始表具有“信息”(例如,生成数据的月份),则可能需要将此列作为附加列。

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

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

关于哪个更快,请使用INJOIN。两者都在做类似的事情。在某些情况下,一个或另一个比较快,但是如果索引和分区可用,则两者都应使用索引和分区。