order BY DESC 的查询优化

Query optimisation for order BY DESC

table "taking" 中的记录总数 = 12 000。

我有以下查询,其中只需要 10 条最近或最后添加的记录。所以我应用了 OrderBy desc 但是当我在 bid 上使用 ORDER BY 应用 DESC 时它会挂起并且查询将 return 在 15 分钟内输出 10 条记录。

 SELECT taking.BId ,taking.calledDate Called,taking.calleduser Caller,taking.callerNotes,taking.Title,
taking.FName,taking.ScName,taking.takingPhase, Training.TName,
taking.TrDate,taking.SubmitDateTime, TrLocation.TrLocation trTrl,
taking.STATUS,taking.DelegNum, taking.Tel, taking.Email,taking.Notes
FROM Taking taking
LEFT JOIN training Training ON taking.Training = Training.TId
LEFT JOIN confirmation ON taking.Bid = confirmation.Bid
LEFT JOIN TrLocation ON taking.TrLocation = TrLocation.TrLId
LEFT JOIN Invoice ON taking.BId =Invoice.BId
LEFT JOIN couriertracking ON taking.BId = couriertracking.bId
LEFT JOIN SalesPerson ON taking.SId = SalesPerson.SId WHERE
taking.SubmitDateTime > DATE_SUB(NOW(), INTERVAL 2 MONTH)  AND IFNULL(taking.SId,0) > 0
ORDER BY taking.BId DESC LIMIT 10

我尝试在出价列建立索引,但查询时间仍然相同。我如何优化查询?

由于您只有 LEFT JOIN,而 LEFT JOIN 只能添加更多行,因此您可以使用子查询限制从 Taking table 返回的行数。然后只有 10 行需要与其他 table 连接。如果任何 JOIN 将添加更多行,您仍然可以在外部查询中使用另一个 LIMIT。

SELECT
    taking.BId,taking.calledDate Called, taking.calleduser Caller,
    taking.callerNotes, taking.Title, taking.FName, taking.ScName,
    taking.takingPhase, Training.TName, taking.TrDate,
    taking.SubmitDateTime, TrLocation.TrLocation trTrl, taking.STATUS,
    taking.DelegNum, taking.Tel, taking.Email,taking.Notes
FROM (
    SELECT taking.*
    FROM Taking taking
    WHERE taking.SubmitDateTime > DATE_SUB(NOW(), INTERVAL 2 MONTH)
      AND taking.SId > 0
    ORDER BY taking.BId DESC
    LIMIT 10
) taking
LEFT JOIN training Training ON taking.Training = Training.TId
LEFT JOIN confirmation ON taking.Bid = confirmation.Bid
LEFT JOIN TrLocation ON taking.TrLocation = TrLocation.TrLId
LEFT JOIN Invoice ON taking.BId =Invoice.BId
LEFT JOIN couriertracking ON taking.BId = couriertracking.bId
LEFT JOIN SalesPerson ON taking.SId = SalesPerson.SId
ORDER BY taking.BId DESC
LIMIT 10

请注意,taking.SId > 0 与 WHERE 子句中的 IFNULL(taking.SId,0) > 0 具有相同的效果。 SId 中带有 NULL 的行将不匹配该条件。

但是 - 您仍然应该验证您在每个 table 中用于连接的每一列上都有索引。对于此查询,您需要

上的索引
  • Training.TId
  • confirmation.Bid
  • TrLocation.TrLId
  • Invoice.BId
  • couriertracking.bId
  • SalesPerson.SId

其中一些看起来像主键。如果是这种情况,那么您不需要为它们编制索引。

要找到 Taking table 的最佳索引并不是那么简单。但是 12K 行并没有那么多。只需要 SubmitDateTime.

上的索引就可以了