嗯,我刚到一个项目,对SQL调优不太了解。
我看到一个流程需要很长时间才能运行,于是我开始查看此流程执行的一些查询。
其中一个查询是运行连接的计数,运行时间长达10分钟。
select count(rtvp.id) from rel_transaction_voucher_product rtvp
join `transaction` t on t.id = rtvp.transaction_id
join voucher v on v.id = rtvp.voucher_id
where v.situation_code = 'YYYYY'
and t.transaction_type_code = 'XXXX'
and t.expiration_date < curdate()
查询中每个表的行:
- REL_TRANSACTION_VOUCHER_PRODUCT:170万
- 成交:160万
- 代金券:130万
解释结果:
id|select_type|table|partitions|type |possible_keys |key |key_len|ref |rows |filtered|Extra |
--+-----------+-----+----------+------+--------------------------------------------------------------------------------------------+--------------------------------------------------+-------+--------------------------+------+--------+-----------+
1|SIMPLE |t | |ref |PRIMARY,transaction_type_code,transaction_id_type_date_IDX |transaction_type_code |38 |const |815765| 33.33|Using where|
1|SIMPLE |rtvp | |ref |uk_transid_voucherid_productid,voucher_id,rel_transaction_voucher_product_transaction_id_IDX|rel_transaction_voucher_product_transaction_id_IDX|38 |voucherprd.t.id | 1| 100.0| |
1|SIMPLE |v | |eq_ref|PRIMARY,fk_voucher_situation_code |PRIMARY |38 |voucherprd.rtvp.voucher_id| 1| 45.46|Using where|
我意识到,如果删除and t.expiration_date < curdate()
,查询将在大约30秒内返回,但这个条件非常重要。
有没有办法让这个查询运行得更快?
1条答案
按热度按时间vatpfxk51#
在
WHERE
条件中使用的列上添加索引。如果您已经在
transaction_type_code
上有一个索引,那么您将不再需要它,因为它是这个新索引的前缀。