如何判断rails是否正在使用我手动创建的索引进行搜索?

时间:2016-06-21 02:32:27

标签: ruby-on-rails indexing sqlite

我需要为我的表手动创建一个索引,因为rails / sqlite3因为collation hasn't been supported yet

所以在我的迁移中我有:

## This doesn't work, so we'll do it manually
#add_index :events, :name, COLLATE: :NOCASE
execute <<-SQL
  CREATE INDEX 'index_events_on_name' ON 'events' ('name' COLLATE NOCASE);
SQL

但显然索引没有被使用,我可以通过尝试使用表中的名称搜索事件来看到,但具有不同的情况。

如何让sqlite3和rails使用我创建的索引?

例如,如果我有一个名为“Fred”的事件,我搜索:

Event.where("name == ?",nameVar)

然后我可以在nameVar ==“Fred”时找到它,但不能在nameVar ==“fred”时找到它

1 个答案:

答案 0 :(得分:1)

仅当搜索也使用此排序规则时,才使用COLLATE NOCASE索引。

时会发生这种情况
  1. 列本身以这种方式声明:

    CREATE TABLE events( ... name TEXT COLLATE NOCASE ...);
    
  2. 或搜索显式使用不区分大小写的比较:

    SELECT ... WHERE name COLLATE NOCASE = ?;
    
  3. 或者你正在使用LIKE,它隐含地不区分大小写:

    SELECT ... WHERE name LIKE ?;
    

    (注意模式字符.LELE的索引也要求列具有文本affinity。)