在 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 时它会起作用,但我不确定它是否代表任何重要的东西。 @WhynarySearch s 定义在FROM slots s 中,它是表slots 的别名。它与其他两个别名 snr 一样用于限定列名,因此在引用 slot_id 之类的列时没有歧义,该列存在于两个表 slotssessions 中。代码应该可以在不删除这些别名的情况下正常工作。 @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 不,它们的工作方式相同。我更喜欢使用像ts 这样的别名,它们可以使代码更短(而且我相信更易读)。此外,当有一个表的自连接时,就不可能执行以下操作:FROM tablename INNER JOIN tablename ON tablename.col = tablename.col,但这会起作用:FROM tablename t1 INNER JOIN tablename t2 ON t1.col = t2.col

以上是关于在 Web App 中查询慢,但在命令行中查询快的主要内容,如果未能解决你的问题,请参考以下文章

mysql慢查询日志开启和存储格式

mongodb命令行中的查询

MySQL查询在两行中获取相同的列数据

在命令行中更新biq查询中的表数据

如何一次查询有限行中的 T-SQL 表

一篇文章快速搞懂Redis的慢查询分析