来自 3 个表的 mysql "distinct query"在大数据上执行缓慢

标签 mysql distinct

这里有三个表,order、order_record、pay,有近2300000条记录。

给定1个order_id时,支付表中会有多于1条记录,所以我需要使用DISTINCT来删除重复的结果

现在我需要从 order_id 上的这三个表连接中获取不同的数据,下面的示例查询 SQL:

SELECT
    DISTINCT (a.order_id)
    a.order_id,a.user_id
    b.boss_order_id,
    c.pay_id,

    FROM order a
    LEFT JOIN order_record b ON a.order_id = b.order_id AND b.is_delete IN (0,1)
    LEFT JOIN pay c ON a.order_id = c.order_id AND c.is_delete =0  WHERE 1=1 AND a.is_delete IN (0,1)
    ORDER BY a.id DESC LIMIT 0, 10

此查询将花费大量时间。 然后我更改为使用“GROUP BY”:

SELECT

    a.order_id,a.user_id
    b.boss_order_id,
    c.pay_id,

    FROM order a
    LEFT JOIN order_record b ON a.order_id = b.order_id AND b.is_delete IN (0,1)
    LEFT JOIN pay c ON a.order_id = c.order_id AND c.is_delete =0  WHERE 1=1 AND a.is_delete IN (0,1)
    GROUP BY a.order_id
    ORDER BY a.id DESC LIMIT 0, 10

这次查询需要122秒。

有没有更快的实现方法?

最佳答案

您正在使用左连接。因此,您可以这样做:

SELECT o.order_id, o.user_id, orr.boss_order_id, p.pay_id,
FROM (SELECT o.*
      FROM order o
      WHERE o.is_delete IN (0, 1)
      ORDER BY o.id DESC
      LIMIT 10
     ) o LEFT JOIN
     order_record orr
     ON o.order_id = orr.order_id AND
        orr.is_delete IN (0, 1) LEFT JOIN
     pay p
     ON o.order_id = p.order_id AND
        p.is_delete = 0 
WHERE 1=1 AND o.is_delete IN (0, 1)
GROUP BY o.order_id
ORDER BY o.id DESC
LIMIT 0, 10

您错误地使用了 GROUP BY,因为 SELECT 中有未聚合的列,而 GROUP BY 中没有这些列。

关于来自 3 个表的 mysql "distinct query"在大数据上执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240091/

相关文章:

c# - LINQ 双向区分多个属性

PHP Mysql 计算另一个表中给出的原因值的不同原因

mysql - #1054 - 'node.id' 中的未知列 'on clause'

mysql - 如何使无引号、逗号分隔的 ID 列表适用于 MySQL 中的 IN 子句

mysql - 如何在同一个 Docker 容器上运行 JIRA 和 MySQL

mysql - SQL仅选择列上具有最大值的行

C# distinct List<string> by substring

java - MongoDB/Java : Finding unique documents based on value

postgresql - 如何使用带有 DISTINCT 特定列的 Zend 构建选择?

sql - 如何实现用户发帖限制?