【问题标题】:Avoiding JOIN to increase performance?避免加入以提高性能?
【发布时间】:2014-01-12 09:05:14
【问题描述】:

假设我有用户表:
|编号 |用户名 |电子邮件 |地址 |

和帖子表:
|编号 |发布 |用户 ID |日期 |

当我想显示帖子时,每次我都需要去用户表从 user_id 检索用户名。我想避免对这个简单的数据检索使用 JOIN,所以我要做的是在帖子表中添加另一个列:
|编号 |发布 |用户 ID |用户名 |日期 |

这样我在显示帖子时不必使用 JOIN 来检索用户名

你觉得这样更好吗?

【问题讨论】:

  • 没有理由避免简单的内部连接。如果您在user_id 上放置一个外键索引,则连接根本不会对性能造成明显影响。 Mysql就是为这种事情而构建的。
  • 多个 (3-4) 连接的性能如何?
  • 如果它们都是索引连接,那么不,仍然几乎没有性能损失。

标签: mysql sql join key


【解决方案1】:

没有。您的替代结构容易受到不一致的影响(例如,如果用户更改了他的名字;请在此处阅读有关第三种正常形式 http://en.wikipedia.org/wiki/Third_normal_form#.22Nothing_but_the_key.22) 为什么不想使用 JOIN?是否设置了合适的索引?

【讨论】:

  • 我不想使用 JOINS,因为我需要改进性能的每一点。我知道查询会运行很多次。
  • 你认为使用带索引的JOINS不会很慢吗?
  • 见上面 spsc_tech 的评论。您还可以查看当前的 query_cache 配置以提高性能。 dev.mysql.com/doc/refman/5.1/en/query-cache.html
  • 联接是关系数据库的设计目的。你想做什么,每秒运行一百次查询?以这种速度,产生性能差异的将是代码和数据库之间的连接速度,而不是查询本身。在我的业务系统上,性能 99% 取决于获取结果的大小,因为存在带宽和 PHP 内存瓶颈。例如:20 个连接和 100 个结果的查询需要 0.003 秒,0 个连接和 100 个结果的查询需要
【解决方案2】:

我认为这取决于设计和未来,我建议你不要这样做:
虽然从目前来看,你会认为避免join会更好,但是如果你的应用程序扩展了,使用这种非规范化的表结构是没有好处的。

例如,如果其中一位发帖人更改了用户名,你怎么能做到这一点?更新整个表?如果您的数据可能超过 1000 万个元组,那将很困难,因为update 会在更新过程中锁定表。
所以我不会推荐这个。

如果您的应用程序需要以这种方式频繁更新,则可以省略连接性能。

【讨论】:

  • 是的,计划是更新表格。但是我同意你的观点,它需要更新大表,我的妥协是假设这不会经常发生(不像为每个帖子检索用户名)
【解决方案3】:

如果[users]表的[id]是主键,我觉得用JOIN就够了。

或者,如果你选择有限数量的posts,比如10个帖子,也可以试试这个sql:

select id, post, user_id, 
    (select username from users where id = user_id) as username, date
from posts
limit 0, 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多