Sqlite查询优化技巧——将LIKE语句转换为比较语句

来源:互联网 发布:mac air桌面壁纸 高清 编辑:程序博客网 时间:2024/05/21 01:48
项目中用到了数据库,其中一个表有33万条数据。对这个表进行查询,执行类似“SELECT * FROM table1 where ds_key like 'asd%%'这样的语句,在我的Touch上用了大概11秒,体验很差。
调查发现,虽然已经对table1增加了索引,但是在实际执行的时候,如果查询条件包含LIKE,就不会使用索引。
想知道查询是不是用了索引,可以参考
http://www.sqlite.org/eqp.html这个链接提供的方法进行验证。
而改成“SELECT * FROM table1 where ds_key >= 'asd' and ds_key < 'ase'”这样的语句,查询时就会使用到索引,花费时间只有零点几秒,效率提高了几十倍。
当然,这只针对查询以某个字符串开头的记录的情况,而对于like '%%asd%%'这样的就没法优化了。
下面的问题就是如何获得输入关键词的“下一个比它大”的词了。
考虑到字段中还包含中文,最终我写了这样一段代码:
  1. //获取字符串的下一个比它大的字符串 
  2. - (NSString*)nextStringAfterString:(NSString*)text 

  3. NSString *nextString = nil; 
  4. int length = text.length; 
  5. NSString *prefixString = [text substringToIndex:length - 1]; 
  6. NSString *lastString = [text substringFromIndex:length - 1]; 
  7. const char* lastChar = [lastString UTF8String]; 
  8. int lastLength = strlen(lastChar); 
  9. if (lastLength == 1) {//ASCII 
  10. char newChar1[2]; 
  11. newChar1[0] = lastChar[0] + 1; 
  12. newChar1[1] = 0; 
  13. NSString *newString1 = [NSString stringWithUTF8String:newChar1]; 
  14. nextString = [prefixString stringByAppendingString:newString1]; 

  15. else if (lastLength == 3) {//中文 
  16. char newChar2[4]; 
  17. newChar2[0] = lastChar[0]; 
  18. newChar2[1] = lastChar[1]; 
  19. newChar2[2] = lastChar[2] + 1; 
  20. newChar2[3] = 0; 
  21. NSString *newString2 = [NSString stringWithUTF8String:newChar2]; 
  22. nextString = [prefixString stringByAppendingString:newString2]; 

  23. return nextString; 
  24. }
复制代码
0 0
原创粉丝点击