在 Web App 中查询慢,但在命令行中查询快
Posted
技术标签:
【中文标题】在 Web App 中查询慢,但在命令行中查询快【英文标题】:Query slow in Web App, but fast in command line 【发布时间】:2021-03-30 11:57:27 【问题描述】:我需要从由第三个链接的两个表中检索记录。除了链接其他两个表的键之外,会话内容不包含我需要的任何信息。
我目前正在使用这些连接:
SELECT sessions.name, rooms.name, slots.type, slots.dayString, slots.startHour, slots.startMinute, slots.endHour, slots.endMinute
FROM slots
INNER JOIN sessions
INNER JOIN rooms
;
在 SQLite DB 浏览器中只需要 50 毫秒,但在我调用相关 API 端点时需要几秒钟的缓冲。
如果加载这么长时间我就不能使用它除了限制它返回的行数(当前返回77000)之外,还有什么可以改善查询时间的吗?
【问题讨论】:
您能否详细说明加入条件(插槽、会话和房间)? @KenLee “加入条件”是什么意思?谢谢 【参考方案1】:会话内容不包含我需要的任何信息,除了 链接其他两个表的键。
但是您不使用这些键来设置链接表的条件,所以您实际上正在做的是 3 个表的 CROSS
连接,结果是所有行的笛卡尔积表。
为每个连接使用ON
子句来设置条件:
SELECT sn.name, r.name, s.type, s.dayString, s.startHour, s.startMinute, s.endHour, s.endMinute
FROM slots s
INNER JOIN sessions sn ON sn.slot_id = s.slot_id
INNER JOIN rooms r ON r.room_id = sn.room_id;
将我在ON
子句中使用的列名更改为实际名称。
【讨论】:
感谢您的回答。我替换了所有列名,但是“FROM slots”后面的“s”是什么?当我删除 s 时它会起作用,但我不确定它是否代表任何重要的东西。 @WhynarySearchs
定义在FROM slots s
中,它是表slots
的别名。它与其他两个别名 sn
和 r
一样用于限定列名,因此在引用 slot_id
之类的列时没有歧义,该列存在于两个表 slots
和 sessions
中。代码应该可以在不删除这些别名的情况下正常工作。
@WhynarySearch 如您在此处看到的:dbfiddle.uk/… 代码在语法上是正确的,前提是列名正确。
我的错误。这是 INNER JOIN sessions sn ON sn.slot_id = s.slot_id
是否优于 INNER JOIN sessions ON sessions.slot_Id = slots.slot_Id
。它们有何不同?
@WhynarySearch 不,它们的工作方式相同。我更喜欢使用像t
或s
这样的别名,它们可以使代码更短(而且我相信更易读)。此外,当有一个表的自连接时,就不可能执行以下操作:FROM tablename INNER JOIN tablename ON tablename.col = tablename.col
,但这会起作用:FROM tablename t1 INNER JOIN tablename t2 ON t1.col = t2.col
。以上是关于在 Web App 中查询慢,但在命令行中查询快的主要内容,如果未能解决你的问题,请参考以下文章