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
经过查询,首先是xxxxx这个地址里包含了320万条的交易记录,而且单条记录由于包含了各种交易信息,导致数据量较大。