- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试优化一些在不同表(包括数据)上执行大量查询的 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 优化查询。
如果原始表包含“信息”(例如数据生成的月份),那么您可能需要将其作为附加列包含在内。
一旦数据位于单个表中,您就可以使用索引和分区来加速查询。
请注意,将数据存储在单个表中可能需要更改您的摄取流程 - 即插入数据而不是创建新表。但您的查询会更简单,并且您可以优化数据库。
至于哪个更快,IN
或 JOIN
。两者都在幕后做着类似的事情。在某些情况下,其中之一更快,但两者都应该使用索引和分区(如果可用)。
关于mysql - 性能,为什么JOIN比IN更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308304/
我是一名优秀的程序员,十分优秀!