本文由作者郑智辉授权网易云社区发布。
0.前言
本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化。在两次处理问题过程中,进行的思考。
1.简要描述
在九月底某个新上的游戏业务MySQL慢查询日志
# Time: 2017-09-30T14:56:13.974292+08:00 # Query_time: 6.048835 Lock_time: 0.000038 Rows_sent: 0 Rows_examined: 12884410SET timestamp=1506754573;SELECT status, sdkid, appid, app_orderid, matrix_orderid, pay_orderid, platform, sdk_version, app_channel, pay_channel, serverid, roleid, INET6_NTOA(userip), deviceid, devic e_name, productid, product_count, product_name, matrix_uid, app_uid, order_currency, order_price, activityid, create_time, expired_time, pay_method, pay_mode, ship_url, rese rved, pay_time, recv_time, ship_time, pay_sub_method, pay_amount, free_amount, pay_currency, pay_total_money, pay_free_money, credit, pay_fee, extra_columns, is_test FROM MatrixOrderSucc WHERE status >= 200 AND status < 300 AND recv_time < DATE_SUB(NOW(), interval 20 SECOND) AND recv_time > DATE_SUB(NOW(), interval 24 HOUR) ORDER BY retry LIMIT 1;
第一次处理方式:在该表上添加了(recv_time,status)索引,然后慢查询没有;
正当以为事情解决的时候,该游戏10月份大推,然后数据量激增,然后慢查询又出现了。
第二次处理方式:删除之前的索引,然后改为对(status,recv_time)添加索引。然后至今该SQL未出现慢查询了。
线上环境说明:
MySQL 5.7.18
表引擎为Innodb
系统内核:Debian 3.16.43-2
接下来说说这两次处理过程中的测试和分析。