我在 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
由于各个表的大小,现在执行查询大约需要 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
我知道这可能会导致行不清晰,但我不确定前端的 php 代码是否已经解决了这种情况。所以我其实是想比较两个结果集的数据,如果不限制的话,这两个结果集的结果都是大约83000行。
任何人都可以想出一种在 SQL 中执行此操作而不是通过 php 脚本执行此操作的方法。我已经用肉眼比较了前 100 行,没有任何问题,但众所周知,只有在第 101 行有一个例外才会把一切都搞砸。所以我需要一个我可以经常执行几次的查询,以查看一个结果集中是否有行不在另一个结果集中。
好的,首先,与 PHP 开发人员交谈,看看是否为您解决了这种情况,这样可以避免很多痛苦和心痛!
除此之外,尝试使用 group by 而不是 distinct,看看性能差异是什么 - 根据表上的索引,group by 可能更快。
使用 GROUP BY 选项,您可以添加一个计数 (*),然后与 php 开发人员交谈,以确保他们知道如果该结果为 2 或更多,那么他们需要以不同于结果为 1 的方式处理它。
您是否尝试过将 order by 替换为 group by 然后使用 count(*) > 1 语句。那应该显示是否有重复的行
从每个查询中选择计数并进行比较?
您可以将 ORDER BY 放入单独的查询中,然后使用 INNER JOIN 获取所需的其余列。
还要在 table1 中的 (column_to_distinct,primary_key, colA) 和 table2 中的 colA 上放置一个索引,以允许 MySQL 进行索引扫描。
将 ORDER BY 放在 INNER JOIN 中允许 MySQL 更快地执行排序,因为要排序的列更少。
你需要一个关于 的索引
tableB
。colA
此外,它更有效率
(因为
tableA
.与.ColC
相同)和 tableA 中 ColA、ColC 的索引。tableB
ColA
你的两个查询之间的差异不应该很大,只要你继续选择少量文章(在你的例子中是 20 篇)并且你从头开始(我假设你有页面)。
另一个建议是尝试在 tableB 上建立索引,并在 distinct 子句中选择所有列。
只要您使用页面(不同记录 1-20、不同记录 21-40 等),在客户端中实施“不同”子句就非常困难。程序会变得不必要的复杂。