我创建了3个表,如:
db.execSQL("CREATE TABLE IF NOT EXISTS programs (id_program INTEGER PRIMARY KEY AUTOINCREMENT , id_channel TEXT , nom_prgrm TEXT , debut TEXT , fin TEXT , FOREIGN KEY(id_channel) REFERENCES channels(id_channel)) ");
db.execSQL("CREATE INDEX __program_index ON programs(nom_prgrm)");
db.execSQL("CREATE TABLE IF NOT EXISTS categories (id_categorie INTEGER PRIMARY KEY AUTOINCREMENT, nom_categorie TEXT)");
db.execSQL("CREATE UNIQUE INDEX __categorie_index ON categories(nom_categorie,id_categorie)");
db.execSQL("CREATE TABLE IF NOT EXISTS categories_programs (id_categorie INTEGER REFERENCES categories(id_categorie) ,id_program INTEGER REFERENCES programs(id_program), PRIMARY KEY(id_categorie,id_program))");
程序表包含alomost 2500条记录和类别150,因此链接表有3400 rec
当我执行此查询时,需要很长时间才能向我显示结果我不知道如何优化这个!!
SELECT id_channel , nom_categorie , debut , fin , nom_prgrm FROM programs, categories_programs, categories WHERE ( (categories_programs.id_program = programs.id_program) AND (categories_programs.id_categorie = categories.id_categorie) AND ('"+sentence+"' LIKE ('%' || nom_categorie || '%')))
可能这是导致这个问题的联接?
感谢您的帮助
我的问题解决了我在Android 4.1上尝试了相同的代码并且它工作得非常快但是使用S2(android 2.3)它很慢!
答案 0 :(得分:2)
可能导致缓慢的原因是
LIKE ('%' || nom...
在开头使用通配符将使数据库解析该列上的所有内容。
此外,如果您准备语句然后绑定参数(尽管它不重要),它会有所改进。
<强> [编辑] 强>
如果这不是问题,你必须考虑你正在评估LIKE条款3400次(并且你只有150个类别)。
尝试使用以下内容预先过滤类别表:
SELECT id_channel , nom_categorie , debut , fin , nom_prgrm
FROM
programs,
categories_programs,
(select id_categorie,nom_categorie from categories where ('"+sentence+"' LIKE ('%' || nom_categorie || '%'))))
categories
WHERE (categories_programs.id_program = programs.id_program) AND (categories_programs.id_categorie = categories.id_categorie)
(我没有测试过查询,所以可能会有一些拼写错误)
<强> [/ EDIT] 强>
答案 1 :(得分:0)
用JOIN替换查询怎么样?
SELECT id_channel , nom_categorie , debut , fin , nom_prgrm FROM programs
JOIN categories_programs ON categories_programs.id_program = programs.id_program
JOIN categories ON categories_programs.id_categorie = categories.id_categorie
WHERE '"+sentence+"' LIKE ('%' || nom_categorie || '%')));
虽然不确定你在最后一个条件下真正想要做什么......