我试图优化一些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
或加权平均值,在某些表中只是纯选择。
另外,我按一个表中的某些字段进行分组,可以按房间进行分组,而另一些则可以按楼层进行分组
答案 0 :(得分:2)
例如,假设我有10个这种格式的表:
这是您问题的基础。不要将相同的信息存储在多个表中。将结果存储在单个表中,然后让MySQL优化查询。
如果原始表具有“信息”(例如,生成数据的月份),则可能需要将此列作为附加列。
一旦数据在单个表中,就可以使用索引和分区来加快查询速度。
请注意,将数据存储在单个表中可能需要更改摄取过程-即,插入数据而不是创建新表。但是您的查询会更简单,并且您可以优化数据库。
关于哪个更快,请使用IN
或JOIN
。两者都在做类似的事情。在某些情况下,一个或另一个比较快,但是如果索引和分区可用,则两者都应使用索引和分区。