如何解决SQLite查询运行缓慢,需要优化帮助
| 我有一个SQLite DB,其中一个表中约有24k记录,另一表中有15k。包含15条记录的表包含有关用户(大约1k用户)需要填写的表单的信息。具有24k记录的表保存有关谁以及何时填写哪些表格的信息。当用户登录时,查询运行大约需要约3/4秒的时间才能确定用户到目前为止所完成的工作。对我的客户来说太长了。我知道我无法以最佳方式进行查询,因为它们包含在循环中。但是我似乎无法弄清楚如何优化查询。 查询运行如下: 1)选择所有表格和信息$result = $db->query(\"SELECT * FROM tbl_forms\");
while($row = $result->fetchArray()){
//Run other query 2 here
}
2)对于每个表单/行,运行一个查询,该查询为用户找出关于该表单的最新完成信息。
$complete = $db->querySingle(\"SELECT * FROM tbl_completion AS forms1
WHERE userid=\'{$_SESSION[\'userid\']}\' AND form_id=\'{$row[\'id\']}\' AND forms1.id IN
(SELECT MAX(id) FROM tbl_completion
GROUP BY tbl_completion.userid,tbl_completion.form_id)\",true);
有15种形式,因此总共有16个查询在运行。但是,对于我的表结构,我不确定如何使用1个联接查询来获取“最新”(又称最大表单ID)表单信息。
我的表结构如下所示:
tbl_forms:
id | form_name | deadline | required | type | quicklink
tbl_completion:
id | userid | form_id | form_completion | form_path | timestamp | accept | reject
编辑:Index on tbl_forms (id),Index on tbl_forms (id,form_name),Index on tbl_complete (id)
我尝试使用类似以下的查询:
SELECT * FROM tbl_completion AS forms1
LEFT OUTER JOIN tbl_forms ON forms1.form_id = tbl_forms.id
WHERE forms1.userid=\'testuser\' AND forms1.id IN
(SELECT MAX(id) FROM tbl_completion GROUP BY tbl_completion.userid,tbl_completion.form_id)
这将为我提供有关已完成的表单的最新信息以及表单信息,但是唯一的问题是我需要将所有表单输出到表中(例如:Form 1-Incomplete,Form 2-已完成,等等)我似乎无法弄清楚如何使其与左表tbl_forms一起工作并获取所有表单信息以及\“ latest \”表单tbl_completion信息。我还尝试用最后一个\“ table \”做一个3 LOJ作为持有maxid的临时表,但是它很慢并且没有给我我想要的东西。
有人可以帮忙吗?是否可以运行一次更好的优化查询,还是可以在数据库方面执行其他操作以加快速度?先感谢您。
解决方法
您缺少索引。看到:
索引的DO和DONT
另外,如果您在where子句中输入userid,则ѭ5可能会丢弃不需要的行。
,听起来您可能会遇到SQLite的并发限制。 SQLite不支持并发写入,因此,如果您有很多用户,那么最终会引起很多争用。您应该考虑迁移到另一个DBMS,以满足您的扩展需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。