MySQL查询优化-长时间运行查询
我在mysql中有一个查询,需要很长时间才能执行。trans表中约有350k条记录,trans_detail表中约有1m条记录 如果能在优化查询或数据库结构方面得到一些帮助,我将不胜感激 查询:MySQL查询优化-长时间运行查询,mysql,optimization,Mysql,Optimization,我在mysql中有一个查询,需要很长时间才能执行。trans表中约有350k条记录,trans_detail表中约有1m条记录 如果能在优化查询或数据库结构方面得到一些帮助,我将不胜感激 查询: SELECT DATE_FORMAT(t.utc_date_due, '%b %Y') AS date_trans, LAST_DAY(t.utc_date_due) AS date_end, SUM(td.amount * lode) AS 'amount', SUM(
SELECT
DATE_FORMAT(t.utc_date_due, '%b %Y') AS date_trans,
LAST_DAY(t.utc_date_due) AS date_end,
SUM(td.amount * lode) AS 'amount',
SUM(t.amount_paid * lode) AS 'paid'
FROM trans t
LEFT JOIN trans_detail td ON t.id = td.trans_id AND td.ident = 'c'
WHERE t.company_id = 1
AND (trans_type_id = 'inv' or trans_type_id = 'crn')
AND t.is_deleted = 0
AND t.is_draft = 0
GROUP BY DATE_FORMAT(t.utc_date_due, '%b %Y')
ORDER BY utc_date_due
解释
:
+----+-------------+-------+-------------+----------------------------------------------------------+--------------------------------------+---------+----------------+------+-----------------------------------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------------+----------------------------------------------------------+--------------------------------------+---------+----------------+------+-----------------------------------------------------------------------------------------------------+
| 1 | SIMPLE | t | index_merge | fk_trans_company,fk_trans_trans_type,is_deleted,is_draft | fk_trans_company,is_draft,is_deleted | 4,1,2 | NULL | 995 | Using intersect(fk_trans_company,is_draft,is_deleted); Using where; Using temporary; Using filesort |
| 1 | SIMPLE | td | ref | fk_trans_detail_trans,ident | fk_trans_detail_trans | 4 | actester2.t.id | 1 | |
+----+-------------+-------+-------------+----------------------------------------------------------+--------------------------------------+---------+----------------+------+-----------------------------------------------------------------------------------------------------+
我先换一行:
AND (trans_type_id = 'inv' or trans_type_id = 'crn')
要使用IN子句,请执行以下操作:
AND (trans_type_id in ('inv', 'crn'))
试着把
td.ident = 'c'
在WHERE子句中。
您可以在utc_date_due创建索引
我个人建议,如果速度至关重要,使用两步方法,你应该使用一个临时表并插入元素,然后只在临时表上求和。这两个表是等效的,使用其中任何一个都不能获得性能。通常,但不总是-这取决于字段是否被索引+1.链接的thx。很高兴知道,但这对索引列并不重要。