gpt4 book ai didi

mysql - 在 Ruby on Rails 应用程序中使用 MySQL View 来提高性能

转载 作者:IT王子 更新时间:2023-10-28 23:49:24 29 4
gpt4 key购买 nike

我在 rails 项目(在 rails 2.0.5 上运行)中遇到了一些性能问题,例如在我的用户管理页面中。

我的用户模型有许多关系(详细信息、地址、角色...),它们会被急切加载。这会创建非常庞大的 SQL 查询,在某些情况下,加载 30 个用户几乎需要一分钟。另一方面,去除急切加载会产生数百个查询,最后我遇到了同样的问题:加载页面很慢。

我曾经在 Java 和 Oracle 上进行开发,对于我用来创建 View 的这种大查询,这些 View 会被缓存以加快渲染速度。维护起来非常无聊,因为我必须在 View 脚本等中手动更新数据库字段...

但它确实有出色的表现....所以我想知道是否有人尝试实现一些东西来利用事件记录中的 Mysql View ?

我只是做了一些基本的测试,这是我的看法(示例中只有几个字段,我有一个标准的 Restful Authentication 用户表,以及一个用于个人数据的大表“详细信息”):

CREATE VIEW users_vs AS SELECT
users.id ,
users.login ,
users.email ,
details.last_name ,
details.first_name ,
details.phone ,
details.fax ,
FROM `users` LEFT OUTER JOIN `details` ON details.user_id = users.id ;

然后是模型:

class UsersV < ActiveRecord::Base
end

在我的控制台中尝试了一些东西:

u=UsersV.find(:first)  # ok !
u=UsersV.find_by_last_name('smith') #=> ok !
us=UsersV.find_all_by_last_name('smith') #=> ok too !

查看日志,简单查询的处理方式与任何表查询相同

当然,那些假模型只是用来读取数据。

我想知道:

  • 如果有人已经尝试过?

  • 如果这是个好主意?

  • 如果我应该研究类似 memcached 的东西...

最佳答案

View 的“问题”(在这种情况下,您可能需要一个物化 View ,假设复杂查询所基于的数据不经常更改)是您违反了 Rails 的 DRY'ness,在某种程度上(为 View 添加 UserV 模型,纯粹主义者会认为这是对 User 模型的复制。)

因此,理想的解决方案是充分利用 RDBMS 进行复杂查询。如果未缓存的查询仍然需要很长时间才能执行(您仍然必须运行它们来填充 memcached),或者如果您无法容纳一点时间捏造(即缓存的结果),则 Memcached 将无法为您提供帮助t 必须是实时精确的)和/或所涉及的表经常被修改。

  • 在 MySQL 中,看看您是否可以进一步优化查询,使其需要几毫秒而不是几秒(添加适当的索引、运行 ANALYZE 等)
  • 如果您可以选择使用/试用其他 RDBMS,例如 Postgres,请务必尝试一下。与 Oracle 和 Postgres 等其他基于成本的引擎相比,MySQL 的复杂连接非常糟糕 (InnoDB)。我从 MySQL 切换到 Postgres,在 MySQL 上需要 30 秒以上的复杂连接(所有索引都到位)在 Postgres 上需要几毫秒。如果玩 Postgres,请充分利用 PGAdminIII 的图形解释计划工具。

关于mysql - 在 Ruby on Rails 应用程序中使用 MySQL View 来提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/530119/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com