問題背景:一個以太坊的瀏覽器(eth-explorer),後臺須要創建數據庫保存這條公鏈上的全部交易記錄,用於用戶隨時查詢,展現最新區塊和交易等功能,表的結構以下:mysql
在某一天使用時,發現explorer響應很是緩慢,常常數據沒法返回,通過簡單的接口抓包,查看日誌分析,發現後臺系統連接mysql出現了超時的情況:spring
因而,登陸mysql,執行show full process list分析查詢語句,很快的發現到了某條慢查詢耗費了大量的時間,最長達到了30s+,比連接池設定的10s超時時間都還要長,於是後臺系統天然報錯(後臺系統使用的是springboot+mybatis框架)sql
查詢時間很長的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萬條的交易記錄,並且單條記錄因爲包含了各類交易信息,致使數據量較大。瀏覽器