[英]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.