首页 > 解决方案 > 耗时较长的mysql查询需要优化

问题描述

这是我的查询和销售表,几乎有 18485388 条记录,而 evs_MAX_3 只有 29 条记录,但根据我的查询,需要搜索所有记录以找出匹配的记录。但是这种方法花费了太多时间,任何人都可以建议我更好的方法。

create table tmp_e1 as select sale_record_id,
transaction_id,
date(sale_date_time) as date,
sale_amount,
float_account_id,
(float_account_balance_after) as close_Balance,
sale_status_id,'max3' as type from dailyreports.evs_sale 
where sale_record_id in (select 
                         sale_id 
                         from dailyreports.tmp_evs_MAX_3 
                         group by date)

标签: mysqldatabase

解决方案


(缓慢的部分是SELECT;我已将其从 中提取出来CREATE TABLE以专注于它。)

IN ( SELECT ... )通常是一个缓慢的构造。查询可以重写为

select  sale_record_id,
        transaction_id,
        DATE(sale_date_time) as date,
        sale_amount,
        float_account_id,
        float_account_balance_after as close_Balance,
        sale_status_id,
        'max3' as type
    FROM ( SELECT  sale_id
            FROM  dailyreports.tmp_evs_MAX_3
            GROUP BY  date 
         ) AS t
    JOIN  dailyreports.evs_sale  ON sale_record_id = t.sale_id 

这些可能会有所帮助:

tmp_evs_MAX_3:  INDEX(sale_id, date)
evs_sale:  INDEX(sale_record_id)

请注意FROM将如何仅获得 29 行,然后JOIN将只需要查找 29(?) 行。并且有索引可以帮助每个步骤。

(如果您提供原始公式的SHOW CREATE TABLEand EXPLAIN,我们可以指出它为什么这么慢。)


推荐阅读