繁体   English   中英

加快MYSQL大型查询

[英]Speed up MYSQL LARGE query

我遇到一个非常大的MYSQL查询问题,该查询正在处理10分钟以显示记录。

查询如下所示:

SELECT SQL_CALC_FOUND_ROWS * FROM (
        SELECT 't-0' as typo, sh_inquiry.id as ref, sh_inquiry.pid as pid, partner, sh_inquiry.order, if(p_status IS NULL OR p_status = 0,'not paid','paid') as payment, p_voucher, country, city, delivery_date, sh_inquiry.amount as c_amount, currency as c_currency, NULL as s_amount, NULL as s_currency, IF(confirmed=0,if(delivered=0,"not confirmed","delivered"),if(delivered=0,"confirmed","delivered")) as conf
        FROM   sh_inquiry
        LEFT JOIN sh_orders ON sh_inquiry.id = sh_orders.i_id
                LEFT JOIN sh_partners ON sh_partners.pid = sh_inquiry.pid
                LEFT JOIN sh_currency ON sh_currency.id = sh_inquiry.curr_id
                LEFT JOIN sh_country ON sh_country.id = sh_inquiry.cid
                LEFT JOIN sh_debts ON sh_inquiry.id = sh_debts.i_id
        WHERE  sh_inquiry.del = 0 AND sh_inquiry.type = 1 AND sh_orders.del = 0
        UNION
                SELECT 't-1' as typo, sh_orders.i_id as ref, sid as pid, partner, sh_inquiry.order, if(p_status IS NULL OR p_status = 0,'not paid','paid') as payment, p_voucher, country, city, delivery_date, NULL as c_amount, NULL as c_currency, sh_orders.amount as s_amount, currency as s_currency, IF(confirmed=0,if(delivered=0,'not confirmed','delivered'),if(delivered=0,'confirmed','delivered')) as conf FROM sh_orders
                LEFT JOIN sh_partners ON sh_partners.pid = sh_orders.sid
                LEFT JOIN sh_currency ON sh_currency.id = sh_orders.curr_id
                LEFT JOIN sh_inquiry ON sh_inquiry.id = sh_orders.i_id
                LEFT JOIN sh_country ON sh_country.id = sh_inquiry.cid
                LEFT JOIN sh_debts ON sh_orders.id = sh_debts.o_id
                WHERE sh_orders.del = 0 AND sh_inquiry.del = 0
        ) AS U

        ORDER BY typo ASC, delivery_date
                    asc
        LIMIT 0, 10

问题是我使用的2个表必须连接成一个表(那些2个表非常大),这就是为什么我使用UNION语句。 我在jquery datatables服务器端页面中显示记录,因此限制显示的记录对问题没有帮助。

谁能提出加快查询速度的想法? 如果您需要有关数据库结构的更多信息,请询问。

解释性声明被触发:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    17630   Using filesort
2   DERIVED     sh_orders   ALL     i_id    NULL    NULL    NULL    8696    Using where
2   DERIVED     sh_inquiry  eq_ref  PRIMARY,id  PRIMARY     4   reur3918_sh.sh_orders.i_id  1   Using where
2   DERIVED     sh_partners     eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_inquiry.pid  1   
2   DERIVED     sh_currency     eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_inquiry.curr_id  1   
2   DERIVED     sh_country  eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_inquiry.cid  1   
2   DERIVED     sh_debts    ALL     NULL    NULL    NULL    NULL    18678   
3   UNION   sh_orders   ALL     i_id    NULL    NULL    NULL    8696    Using where
3   UNION   sh_partners     eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_orders.sid   1   
3   UNION   sh_currency     eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_orders.curr_id   1   
3   UNION   sh_inquiry  eq_ref  PRIMARY,id  PRIMARY     4   reur3918_sh.sh_orders.i_id  1   Using where
3   UNION   sh_country  eq_ref  PRIMARY     PRIMARY     4   reur3918_sh.sh_inquiry.cid  1   
3   UNION   sh_debts    ALL     NULL    NULL    NULL    NULL    18678   
NULL    UNION RESULT    <union2,3>  ALL     NULL    NULL    NULL    NULL    NULL    

索引所有ID后,查询大约需要133秒。

谢谢大家的想法! 实际上,运行EXPLAIN语句可以帮助我查找未定义INDEX的表。 将INDEX添加到查询中已使用的所有字段(主要在JOIN ON子句中)后,运行时间已缩短至0.83秒

暂无
暂无

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

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