【发布时间】:2014-12-18 07:09:32
【问题描述】:
我有以下验证:
validates :username, uniqueness: { case_sensitive: false }
这导致以下查询运行缓慢:
5,510 ms
SELECT ? AS one FROM "users" WHERE (LOWER("users"."username") = LOWER(?) AND "users"."id" != ?) LIMIT ?
Explain plan
1 Query plan Limit (cost=0.03..4.03 rows=1 width=0)
2 Query plan -> Index Scan using idx_users_lower_username on users (cost=0.03..4.03 rows=1 width=0)
3 Query plan Index Cond: ?
4 Query plan Filter: ?
索引是在我的structure.sql 中使用CREATE INDEX idx_users_lower_username ON users USING btree (lower((username)::text)); 创建的,有关更多信息,请参阅我的问题How to create index on LOWER("users"."username") in Rails (using postgres)。
这是使用我设置的索引并且仍然需要 5 秒以上?这里有什么问题?
【问题讨论】:
-
用户表有多少条记录?
-
您能说明一下您是如何创建
idx_users_lower_username索引的吗? -
LOWER("users"."username")在查询中意味着它正在缩减数据库中的每条记录。索引可以帮助您查找内容,但据我所知,它不能帮助您转换现有记录。 -
@HenrikN,这是可以实现的,至少在 PostgreSQL 中是可以的
-
@blelump 嗯,是的,你是对的:postgresql.org/docs/9.1/static/indexes-expressional.html“索引表达式在索引搜索期间不会重新计算,因为它们已经存储在索引中。”谢谢你。
标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord query-optimization