我在 mysql 中有一个查询,如下所示。
SELECT DISTINCT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Run Code Online (Sandbox Code Playgroud)
由于各个表的大小,现在执行查询大约需要 13 秒。但是这个查询要快得多(即 2 秒)
SELECT `tableA`.`ColA`, `tableA`.`ColB`, `tableB`.`ColA`, ...
FROM `tableA`
LEFT JOIN `tableB` ON `tableA`.`colC` = `tableB`.`colA`
WHERE <whereconditions>
ORDER BY `tableA`.`ColA` DESC `tableB`.`ColA` ASC
LIMIT 0,20
Run Code Online (Sandbox Code Playgroud)
我知道这可能会导致不明确的行,但我不确定前端的 php 代码是否已经处理了这种情况。所以我实际上想比较两个结果集的数据,如果不限制的话,这两个结果集都会产生大约 83,000 行。
任何人都可以想出一种在 SQL 中执行此操作而不是通过 php 脚本执行此操作的方法。我已经通过肉眼比较了前 100 行,没有任何问题,但众所周知,只有第 101 行的一个例外才能搞砸一切。所以我需要一个查询,我可以每隔一段时间执行几次,以查看一个结果集中是否存在不在另一个结果集中的行。
好的,首先,与PHP开发人员交谈,看看这种情况是否为您解决,这样可以省去很多痛苦和心痛!
除此之外,尝试使用 group by 而不是 distinct,看看性能差异是什么 - 根据您在表上的索引,group by 可能更快。
使用 GROUP BY 选项,您可以添加一个 count(*),然后与 php 开发人员交谈以确保他们知道如果结果为 2 或更多,那么他们需要以不同于结果为 1 的方式处理它。