对第二个表中不存在 ID 的两个表的 MySQL 查询优化

Posted

技术标签:

【中文标题】对第二个表中不存在 ID 的两个表的 MySQL 查询优化【英文标题】:MySQL Query Optimization for two tables where ID does not exits in 2nd table 【发布时间】:2016-10-03 06:17:59 【问题描述】:

我们在 mysql 查询下面有这个。虽然查询在具有大量数据的本地主机中顺利运行,但在实时服务器中需要大量时间。我试图优化它,但没有任何效果。这段代码可以用更简单的术语编写吗? 帮助将不胜感激。

SELECT id, Request_By, Org_Name, Branch_Name, SALES_PERSON, Is_Consignee, Is_Shipper, EmailId, Telephone, Credit_LimitRS, IE_Code_No,
    PAN_No, Credit_limitDAYS, GL_Link 
    FROM mst_ship_con_newcust
    WHERE ( not EXISTS ( SELECT * FROM mst_branch_info b where b.id = mst_ship_con_newcust.id) ) 
    ORDER BY id desc

【问题讨论】:

请把解释的结果从服务器贴出来,也让我们大致知道服务器执行查询需要多长时间,以及表中有多少条记录。 我得到了数据,但是在实时服务器中显示结果大约需要 3 1/2 到 4 分钟 好的。请向我们展示解释的结果。在那之前,这只是一个纯粹的猜测。 怎么样?请指导。我只显示第一个表的数据,其中第一个表的主 ID 不在第二个表中。 explain select ... 【参考方案1】:
SELECT id, Request_By, Org_Name, Branch_Name, SALES_PERSON, Is_Consignee,    Is_Shipper, EmailId, Telephone, Credit_LimitRS, IE_Code_No,
PAN_No, Credit_limitDAYS, GL_Link 
FROM mst_ship_con_newcust
  LEFT JOIN mst_branch_info b ON b.id = mst_ship_con_newcust.id
WHERE b.id IS NULL
ORDER BY id desc

这样的 LEFT JOIN 怎么样?

更新:

SELECT id, Request_By, Org_Name, Branch_Name, SALES_PERSON, Is_Consignee,    Is_Shipper, EmailId, Telephone, Credit_LimitRS, IE_Code_No,
PAN_No, Credit_limitDAYS, GL_Link 
FROM mst_ship_con_newcust
  JOIN mst_branch_info b ON b.id = mst_ship_con_newcust.id
ORDER BY id desc

然后加入

【讨论】:

谢谢,但我想显示 mst_ship_con_newcust.id 尚未在 b.id 中退出的位置 LEFT 需要将输出限制为“不存在...尚未”。【参考方案2】:

id 上连接两个表是不常见的。这种架构设计的历史是什么?

确保在两个表上都有以id 开头的索引,然后尝试

SELECT  y.id, y.Request_By, y.Org_Name, y.Branch_Name, y.SALES_PERSON,
        y.Is_Consignee, y.Is_Shipper, y.EmailId, y.Telephone,
        y.Credit_LimitRS, y.IE_Code_No, y.PAN_No, y.Credit_limitDAYS,
        y.GL_Link
    FROM  
    (
        SELECT  n.id
            FROM  mst_ship_con_newcust AS n
            LEFT JOIN  mst_branch_info AS b  ON b.id = n.id
            WHERE  b.id IS NULL 
    ) AS x
    JOIN  mst_ship_con_newcust AS y USING (id)
    ORDER BY  id desc 

【讨论】:

以上是关于对第二个表中不存在 ID 的两个表的 MySQL 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

MySQL JOIN 2 个表并分别获取两个表的总和

如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql

Knex 子查询对第二个表中的数据求和

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

删除第二个表中不包含的记录

java 两个表同时插入数据,第二个表的一个字段是取第一个表的ID值 要怎么取 我拿到的都是空。。