Mysql 如何使用内部联接和子查询优化SQL查询和返回计数

Mysql 如何使用内部联接和子查询优化SQL查询和返回计数,mysql,Mysql,我们得到的结果是正确的,但它需要太多的时间来执行。我们可以优化查询,这将需要较少的时间来执行 SELECT c.client_id FROM client_master c INNER JOIN user_visit_record u ON u.client_id = c.client_id WHERE c.dept_id ='1' AND c.branch_id='1' AND c.client_status IN('Hot','Warm','Cold','Quotation')

我们得到的结果是正确的,但它需要太多的时间来执行。我们可以优化查询,这将需要较少的时间来执行

SELECT c.client_id
FROM client_master c
INNER JOIN user_visit_record u ON u.client_id = c.client_id
WHERE c.dept_id ='1'
  AND c.branch_id='1'
  AND c.client_status IN('Hot','Warm','Cold','Quotation')
  AND u.next_followup_date < '2017-06-01'
  AND u.visit_id IN
    (SELECT max(visit_id)
     FROM user_visit_record
     WHERE client_id=c.client_id)

提前感谢。

我在查询中使用了*,您可以只选择所需的列,这是优化的一种方法

MySQL有几种现有的解决方案,请检查

以下是优化的查询:

试试这个:

SELECT client_id FROM 
  (
    SELECT client_id 
      FROM client_master 
        WHERE dept_id ='1' AND branch_id='1' AND client_status IN('Hot','Warm','Cold','Quotation')
  ) AS c

  NATURAL JOIN

  (
    SELECT client_id
      FROM user_visit_record 
        INNER JOIN (
          SELECT client_id, max(visit_id) as max_visit 
            FROM user_visit_record
              GROUP BY client_id
        ) AS max_user_visit 
            ON (user_visit_record.client_id = max_user_visit.client_id) 
              AND (user_visit_record.visit_id = max_visit)
        WHERE next_followup_date < '2017-06-01'
  ) AS u

检查访问id字段和客户端id的索引。我们没有使用索引。如果为相关列创建索引,您可能会获得更快的速度。我们如何在此查询中进行索引。您可以发送吗?索引位于表级别,而不是查询级别。您需要在表上创建索引。示例:在用户访问记录访问id;上创建索引用户访问记录ix;。有关更多信息,请查看mysql手册中的索引:谢谢@Kruti Patel..但是这个查询检索到了错误的结果。我们能找到其他解决方案吗。??
SELECT c.client_id 
FROM client_master c 
JOIN (SELECT * FROM user_visit_record u ORDER BY u.visit_id DESC) AS t ON t.client_id = c.client_id 
WHERE c.dept_id ='1'   
AND c.branch_id='1'   
AND c.client_status IN('Hot','Warm','Cold','Quotation')   
AND t.next_followup_date < '2017-06-01' 
GROUP BY t.clientid
SELECT client_id FROM 
  (
    SELECT client_id 
      FROM client_master 
        WHERE dept_id ='1' AND branch_id='1' AND client_status IN('Hot','Warm','Cold','Quotation')
  ) AS c

  NATURAL JOIN

  (
    SELECT client_id
      FROM user_visit_record 
        INNER JOIN (
          SELECT client_id, max(visit_id) as max_visit 
            FROM user_visit_record
              GROUP BY client_id
        ) AS max_user_visit 
            ON (user_visit_record.client_id = max_user_visit.client_id) 
              AND (user_visit_record.visit_id = max_visit)
        WHERE next_followup_date < '2017-06-01'
  ) AS u