ActiveRecord`s validate_uniqueness_of produces evil SQL that will not use your existing index!
Before:
SELECT `users`.id FROM `users` WHERE `users`.`email` = BINARY ‘my@email.com’ AND `users`.id 1234) LIMIT 1; –> 0.80s
After:
SELECT `users`.id FROM `users` WHERE `users`.`email` = ‘my@email.com’ AND `users`.id 1234) LIMIT 1; –> 0.00s
Hack to make AR use faster queries on the cost that no case-sensitive queries can be made anymore.
# validates_uniqueness_of produces "column = BINARY 'text'" queries # which will not use existing indices, so we add this # EVIL HACK to make # ALL validates_uniqueness_of in-case-sensitive class ActiveRecord::ConnectionAdapters::MysqlAdapter def case_sensitive_equality_operator "=" end end
apparently solved in rails 3.2 !