繁体   English   中英

使用联接和子查询进行mysql查询优化

[英]mysql query optimization with join and subquery

有人可以帮忙吗? 从缓慢的日志中开始,下面的查询需要11秒钟才能运行,并且耗尽了服务器资源。 如何重新编写此查询以实现更大的优化?

PS:表已建立索引。

查询:

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 [id] => 1 [1] =>主[select_type] =>主[2] => [表] => [3] =>所有[类型] =>所有[4] => [可能的键] => [5] => [键] => [6] => [key_len] => [7] => [参考] => [8] => 38339 [行] => 38339 [9] => [额外] =>)

[2] => Array
    (
        [0] => 2
        [id] => 2
        [1] => DERIVED
        [select_type] => DERIVED
        [2] => province_create
        [table] => province_create
        [3] => ALL
        [type] => ALL
        [4] => kk,province,kkk
        [possible_keys] => kk,province,kkk
        [5] => 
        [key] => 
        [6] => 
        [key_len] => 
        [7] => 
        [ref] => 
        [8] => 261
        [rows] => 261
        [9] => Using where; Using temporary
        [Extra] => Using where; Using temporary
    )

[3] => Array
    (
        [0] => 2
        [id] => 2
        [1] => DERIVED
        [select_type] => DERIVED
        [2] => basic_data
        [table] => basic_data
        [3] => ref
        [type] => ref
        [4] => PRIMARY,kk,kkk,k,parish
        [possible_keys] => PRIMARY,kk,kkk,k,parish
        [5] => kk
        [key] => kk
        [6] => 56
        [key_len] => 56
        [7] => databaseuser.province_create.province
        [ref] => databaseuser.province_create.province
        [8] => 39
        [rows] => 39
        [9] => Using index; Distinct
        [Extra] => Using index; Distinct
    )

[4] => Array
    (
        [0] => 2
        [id] => 2
        [1] => DERIVED
        [select_type] => DERIVED
        [2] => att2
        [table] => att2
        [3] => ref
        [type] => ref
        [4] => indpull,mmm
        [possible_keys] => indpull,mmm
        [5] => mmm
        [key] => mmm
        [6] => 57
        [key_len] => 57
        [7] => databaseuser.basic_data.id
        [ref] => databaseuser.basic_data.id
        [8] => 1
        [rows] => 1
        [9] => Using where; Distinct
        [Extra] => Using where; Distinct
    )

首先,让我假设不需要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该索引也应有所帮助。 但是,您需要了解为什么会得到重复,并解决该问题的根本原因以获得最佳性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM