记一次MySQL巨大表查询优化
今天上班折腾这个搞到晚上9点,记录下来免得后人踩坑
前言
今天项目经理过来说我有一张TAPD单已经挂了一个月了,要我解决免得影响考核。我一看,是首页的数据报表接口速度过慢超时。
这个问题很早就提给我了,那个时候因为其他任务过于着急只能先挂起。现在要过考核所以只能尽快解决。
分析
首先查询代码中的数据表名称,前往正式环境的 MySQL 种查看,不看不知道一看吓一跳,2500万行单表,没有索引。 所以解决方法肯定是先加索引。这里我就被坑了,代码中使用了单独的函数生成 where 子句,我尝试把 where 子句中的值加入索引,结果没有效果。
然后我就尝试打印最后生成的 SQL 语句。结果得到了这样的白痴语句 WHERE a = ? AND b between ? AND ? AND c = ?
。
回想起来之前看过的面经提到,SQL的联合索引在范围检索的时候会慢很多,所以正确的办法应该把所有准确匹配的先放在最左边,MySQL 的联合索引会根据最左原则匹配使用索引。