gpt4 book ai didi

php - SQLite 查询运行缓慢,需要优化帮助

转载 作者:行者123 更新时间:2023-12-03 17:25:41 29 4
gpt4 key购买 nike

我有一个 SQLite 数据库,其中一个表中有大约 24k 条记录,另一个表中有 15 条记录。包含 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 一起工作并获取所有表单信息,以及“最新”表单 tbl_completion 信息。我还尝试使用最后一个“表”作为包含 maxid 的临时表执行 3 LOJ,但它非常慢并且没有给我想要的。

有人可以帮忙吗??是否有更好的优化查询可以运行一次,或者我可以在数据库端做其他事情来加快速度吗?先感谢您。

最佳答案

你缺少索引。看:

DOs and DONTs for Indexes

另外,SELECT MAX(id) FROM tbl_completion GROUP BY tbl_completion.userid, tbl_completion.form_id如果在 where 子句中输入用户 ID,可能会丢弃不需要的行。

关于php - SQLite 查询运行缓慢,需要优化帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139495/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com