一次同事反映说他有一条sql的处理时间很长,快20s才能处理完
如图:
查询时间为19s,
最外层dg_pushcert表的数据量为10w多,数据量不是很多。
此时想到的就是索引问题。之后,同事加上索引以后,发现没什么变化,还是原来的处理时间。这就蒙了。
单拿出来
SELECT date,`to`,usrid,`status` FROM dg_pushcert FORCE INDEX ( pushcert_date ) where date BETWEEN "2019-08-04 00:00:00" AND "2019-08-06 00:00:00"
发现这块就很耗时,所以就猜到了date这个索引是没有用上的。使用EXPLAIN一看,果然
走的全表扫描,并没有用上创建的date索引。
原因是 (查询的数量是大表的大部分,应该是30%以上。)显然没有达到,所以只能强制使用索引了
FORCE INDEX ( pushcert_date )
此时级别为range
从19s变成0.4s效果很显著吧。