SQLite:普通表与虚拟表。哪一个选择?

时间:2016-07-16 06:04:25

标签: android database sqlite full-text-search android-sqlite

我正在开发一个Android应用程序,它使用Sqlite DB来存储和检索数据。该应用程序具有存储和检索文本数据的功能。由于以下好处,我决定采用VIRTUAL表实现

一个。更快执行

湾全文搜索

因为我的应用程序应该可以扩展以保存大量文本数据,并且应该能够快速搜索特定文本。在开始之前,我有几个问题。

  1. 我应该只使用虚拟桌子吗?从长远来看是否安全?我读到保持普通表和虚拟表是安全的。我不认为保留2份相同数据是个好主意
  2. 我打算在虚拟表中索引某些列以提高搜索效率?这会导致任何性能和内存开销吗?
  3. 表格中有7列,要搜索的数据分布在4列。使用虚拟表或索引这4列的普通表是否合适?
  4. 提前致谢

1 个答案:

答案 0 :(得分:0)

FTS表实际上不是一个表;把它想象成一个指数。

为避免将相同数据存储两次,请使用external content table

FTS表将所有数据存储为文本,并且不允许除内置全文索引之外的任何其他索引。此外,documentation说:

  

可以使用两种不同形式的SELECT语句有效查询FTS表:

     
      
  • 按rowid查询。如果SELECT语句的WHERE子句包含“rowid =?”形式的子子句,其中?是一个SQL表达式,FTS能够使用等效的SQLite INTEGER PRIMARY KEY索引直接检索请求的行。
  •   
  • 全文查询。如果SELECT语句的WHERE子句包含“MATCH?”形式的子句,FTS可以使用内置的全文索引将搜索限制为与指定为MATCH子句的右侧操作数的全文查询字符串匹配的文档。
  •   
     

如果这两种查询策略都不能使用,那么FTS表上的所有查询都是使用整个表的线性扫描来实现的。

因此,您永远不应该尝试将非文本数据存储在FTS表中。