这是一般性能问题,我没有错误或类似的事情。
我正在开发一个使用SQLite数据库的应用程序,只想知道查询表格以找到特殊值的最佳,最快和最有效的方法。
示例:
我有一张桌子,我正在寻找一个特殊的字符串 我得到了所有行:
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
然后像
一样遍历游标String searchedString = "THIS_IS_JUST_AN_EXAMPLE_PLEASE_IGNORE_TYPING_ERROR";
boolean success = false;
int count = cursor.getCount();
for(int i=0;i<count;i++) {
String queryString = c.getString(1);
if(queryString.equals(searchedString) {
success=true;
break;
} else {
cursor.moveToNext();
}
}
另一种可能的方法是使用query()
:
Cursor cursor = db.query(
TABLE_NAME, new String[] {STRING_COL},
STRING_NAME + "=?",
new String[] {"THIS_IS_JUST_AN_EXAMPLE_PLEASE_IGNORE_TYPING_ERROR"},
null, null, null, null);
这两种方法之间是否存在性能差异?
很多教程都是通过循环显示迭代,但Docs建议使用query()
方法。
query()
方法与迭代循环相同吗?
它究竟是如何工作的?我无法在任何API中找到。
答案 0 :(得分:2)
手动搜索需要更多代码(这会增加出错的风险)。
DB可能会执行类似的循环,但在DB中进行搜索并不需要将所有数据从DB移动到您的应用程序。
如果数据不多,则两种算法之间不会有明显的性能差异。但是,当数据量变大时,只需创建索引即可加快SQL搜索。
答案 1 :(得分:1)
我能看到的唯一区别是WHERE部分,它缺少第一个算法 如果向查询添加WHERE子句,第一个算法将受益匪浅。然后在性能方面与第二种算法相同。
像
这样的东西Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE STRING_COL = ?", new String[]{"THIS_IS_JUST_AN_EXAMPLE_PLEASE_IGNORE_TYPING_ERROR"});
就像现在一样,第一种算法比较慢。
正如bt @CL所述,通过索引WHERE列可以大大改善这两种算法。