项目中建了一个视图,用到了子查询,类似:
SELECt a.id, a.name,( SELECT SUM( b.amount ) FROM ( `b` JOIN `c` ) WHERe b.pre_id = c.id AND b.id = a.id ) AS `total_amount` FROM a WHERe a.status=1 GROUP BY a.name ORDER BY a.id DESC;
视图查询比较慢,查询一次要3s,以为是视图算法的问题,修改视图算法为MERGE但不生效,因为建立视图用到了GROUP BY,所以算法修改不生效,依然是UNDEFINED。
explain分析,发现视图SQL虽然用到一些索引,但也有一个表是全表扫描,并且采取了临时表查询,所以慢。
继续观察视图SQL,发现子查询b表跟c表用了关联查询,此时b表的pre_id字段是没有建立索引的,尝试着给b.pre_id字段建立索引,接着再explain分析视图SQL,发现都用到了索引查询,查询达到了毫秒级。
接口查询时间发生变化:
结语:优化视图可以尝试分析视图的SQL,看看哪些字段是关联查询的,给它建立索引说不定就出现奇迹了呢。



