mysql order by,limit,where结合引起的效率问题

问题背景:一个以太坊的浏览器(eth-explorer),后台需要建立数据库保存这条公链上的所有交易记录,用于用户随时查询,展示最新区块和交易等功能,表的结构如下:

在某一天使用时,发现explorer响应非常缓慢,经常数据无法返回,经过简单的接口抓包,查看日志分析,发现后台系统链接mysql出现了超时的状况:

于是,登录mysql,执行show full process list分析查询语句,很快的发现到了某条慢查询耗费了大量的时间,最长达到了30s+,比链接池设定的10s超时时间都还要长,因而后台系统自然报错(后台系统使用的是springboot+mybatis框架)

查询时间很长的SQL语句如下:(表名和地址信息删去)

1 SELECT (`hash`,`block_hash`,`block_height`,`tx_seq`,`from`,`to`,`status`,`value`,`nonce`,`timestamp`,`type`,`data`,`contract_address`,`gas_price`,`gas_limit`,`gas_used`,`created_at`,`execute_error`) FROM `table_a` 
2 WHERE (`from` = 'xxxxx' or `to` = 'xxxxx') ORDER BY `block_height` DESC,`tx_seq` DESC LIMIT 125,25

表的索引已经在图一中展示

猜你喜欢

转载自www.cnblogs.com/qq29oo/p/9695775.html