产品信息表数据过百万,未来还将继续增长,之前已经做过优化,将查询时间控制在10秒以内,仍然很慢,而且随着数据的增长,查询速度肉眼可见越来越慢。
如何提升查询效率呢?
第一步:定位查询慢的原因
之前已经做过sql调优,数据列表的sql自认已经没有更多优化的地方,所以就从后台代码上看,是否是程序耽误了时间。
详细的梳理了日志之后发现,列表查询时是使用mybatis自动分页功能,而数据总数是直接在数据查询sql外围套上COUNT来查的,就是这么简单粗暴。而数据查询sql自带许多查询条件和各种join,这就导致count时无比的慢。
那么原因就定位出来了,总数count原sql过于粗糙。
第二步:对症下药
后台代码将查总数功能独立出来,count的sql单独写之后,效果立竿见影,立马快了5秒钟
但是,六七秒的查询时间仍然是太慢,毕竟count的总数需要与数据对上,所以一些查询条件与一些join也是必须的,得把这个count的sql优化一下。
怎么优化呢?想到了建索引。
此条sql涉及的主要过滤字段包括厂商id,客户id,产品类型,和修改时间,那么就建立这四个字段的索引。
建好之后再看查询效率,效果甚微,快了1秒。
使用EXPLAIN分析执行计划,发现并没有用到刚建的索引。
强制使用索引(FORCE INDEX(索引名))。
哇!效果喜人,查询时间降低到两秒以内!
至此,此次优化任务圆满完成,特此记录。