【发布时间】:2013-09-19 17:26:59
【问题描述】:
我有一个有 200,000 行的表。
当我通过 ActiveRecord 模型进行插入/更新时,我看到近 20 个相同的 Exist 查询,每个查询耗时近 100 毫秒!
Domain Load (0.5ms) SELECT "domains".* FROM "domains" WHERE "domains"."name" = 'sgsgroup.in' LIMIT 1
(0.1ms) BEGIN
Domain Exists (90.7ms) SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (89.4ms) SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (91.6ms) SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
[...]
Domain Exists (89.7ms) SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
Domain Exists (89.2ms) SELECT 1 AS one FROM "domains" WHERE LOWER("domains"."name") = LOWER('sgsgroup.in') LIMIT 1
SQL (0.6ms) INSERT INTO "domains" (....
我已经在域表上有“名称”索引。任何想法这里发生了什么以及如何优化这些记录更新?
另外,在记录更新时出现类似这样的相同查询是否正常?
【问题讨论】:
-
90.7ms不是“近 1 秒”,而是近 1/10 秒。 -
doh - 谢谢!更正:P
-
不正常,需要查看插入记录的代码。
-
感谢您的确认。这很奇怪。我重新启动了控制台,现在完全相同的更新/保存使用单个查询,而不是 20 个。我完全不知道它可能是什么。
-
所以我终于找到了根本原因。问题是由于我在控制台中手动加载(和重新加载)我的模型。 ActiveRecord 正在为加载的模型代码的每个实例生成一个单独的数据库查询。为什么我要重新加载我的模型?因为我有 config.threadsafe!在 application.rb 中阻止我使用重新加载! .. 有趣。
标签: sql activerecord model