我有一个运行速度非常慢的查询:
SELECT
"conversation".*,
"teamBotLocation"."id" AS "teamBotLocation.id",
"teamBotLocation"."name" AS "teamBotLocation.name"
FROM
"conversation" AS "conversation"
LEFT OUTER JOIN "teamBotLocation" AS "teamBotLocation" ON "conversation"."teamBotLocationId" = "teamBotLocation"."id"
WHERE
"conversation"."teamBotId" = 'some_id'
AND "conversation"."teamBotLocationId" IN ('some_id','some_id')
AND "conversation"."isDeleted" = false
AND "conversation"."isBlocked" = false
AND "conversation"."isBroadcast" = false
AND "conversation"."isGroup" = false
ORDER BY
CASE
WHEN "firstName" = '' THEN NULL
ELSE 0
END ASC NULLS LAST,
"conversation"."firstName" NULLS LAST,"conversation"."id" DESC
LIMIT
10 OFFSET 100;
这个查询实际上做了什么?
我有一个包含近 2000 万行的对话表。我将所有这些对话显示在一个默认限制为 10 的表格中。我们按这 5 列
firstName
、lastName
、phone
、email
和 createdAt
按升序/降序对表格进行排序.
我目前正在生产中使用此查询。对于较少数量的结果,执行时间低于一秒,这很好。但是,当结果数以百万计(假设为 100 万)时,执行时间就太慢了,大约需要 10 秒。我发现缓慢的主要原因是排序。
这是我的查询计划:
我需要一个在 1-2 秒内执行查询的解决方案,请记住,可以按升序或降序对这 5 列进行排序:
firstName
、lastName
、phone
、email
和createdAt
。
注意
您可以首先对firstName列进行排序,限制为10,然后再对结果表与其他四列进行排序 对 10 行进行排序要快得多