我的数据库结构大致如下:
table1(name) - < table2 - < table3(得分)
其中 - <意味着1对多的关系。我需要做的是对于给定列表中的每个字符串,从表3中找到具有最大分数值的链接条目。我现在这样做的方式很慢,我想知道它可以加速。
我是怎么做到的:
SELECT k.score,k.yaw,k.pitch,k.roll,k.kp_number,k.ke_number,k.points,k.elems --various fields of third table
FROM File
JOIN FaceDetection AS d ON d.f_id=File.file_id --joining second table
JOIN FaceKey AS k ON k.face_det=d.fd_id --joining third table
WHERE name=:fld
ORDER BY k.score DESC
我打开事务,用上面的文本准备查询,并在循环中从数据库中检索我感兴趣的条目,然后提交事务。什么是更好,更快的方式?
答案 0 :(得分:1)
索引可用于所有用于查找或排序的列,但查询不能为每个表使用多个索引。
检查EXPLAIN QUERY PLAN输出以查看此查询是执行表扫描还是使用索引。
除了FaceKey
之外,您不会从任何表返回值,因此您实际上不需要进行连接。
但是,如下所示重写查询可能会有所帮助,也可能没有帮助:
SELECT score,
yaw,
pitch,
roll,
kp_number,
ke_number,
points,
elems
FROM FaceKey
WHERE face_det IN (SELECT fd_id
FROM FaceDetection
WHERE f_id IN (SELECT file_id
FROM File
WHERE name = :fld))
ORDER BY score DESC