使用join和子查询进行mysql查询优化

时间:2017-04-09 11:28:00

标签: php mysql join

有人可以帮忙解决这个问题。从慢速日志下面的查询运行需要11秒,并占用服务器资源。如何重新编写此查询以实现更大的优化?

P.S:表格已编入索引。

查询:

<option>

EXPLAIN报告:

[1] =&gt;排列         (             [0] =&gt; 1             [id] =&gt; 1             [1] =&gt;主             [select_type] =&gt;主             [2] =&gt;             [table] =&gt;             [3] =&gt;所有             [type] =&gt;所有             [4] =&gt;             [possible_keys] =&gt;             [5] =&gt;             [key] =&gt;             [6] =&gt;             [key_len] =&gt;             [7] =&gt;             [ref] =&gt;             [8] =&gt; 38339             [rows] =&gt; 38339             [9] =&gt;             [额外] =&gt;         )

SELECT SUM(the_val) AS value
FROM
  (SELECT DISTINCT basic_data.id,
                   att2.the_val
   FROM province_create
   INNER JOIN basic_data ON province_create.province = basic_data.province
   INNER JOIN att2 ON att2.church_id = basic_data.id
   WHERE province_create.block = 0
     AND att2.month = 'Feb'
     AND att2.year = '2017'
     AND basic_data.parish = 1
     AND att2.report = 'ATTENDANCE'
     AND province_create.disable = 0 ) t1;

1 个答案:

答案 0 :(得分:1)

首先,我假设不需要SELECT DISTINCT。然后查询可以写成:

SELECT SUM(a.the_val)
FROM province_create pc INNER JOIN
     basic_data bd
     ON pc.province = bd.province INNER JOIN
     att2 a
     ON a.church_id = bd.id
WHERE pc.block = 0 AND
      a.month = 'Feb' AND
      a.year = '2017' AND
      bd.parish = 1 AND
      a.report = 'ATTENDANCE'
      pc.disable = 0 ;

其次,您应该尝试对表进行索引。很难说最好的索引是什么,所以尝试添加以下内容:

  • attr2(year, month, report, church_id, the_val)
  • basic_data(id, province, parish)
  • province_create(province, disable)

即使需要SELECT DISTINCT,此索引也应该有所帮助。但是,您需要了解为什么要获得重复项并找出问题的根本原因以获得最佳性能。