最近解决mysql慢查询问题,先把sql大概说明下 mysql
select pay_date from tableName where add_time >'2019-05-14 23:59:59' and mark = 0 order by pay_date limit 10; select pay_date from tableName where add_time >'2019-05-17 23:59:59' and mark = 0 order by pay_date limit 10;
sql
#5000万+的数据 #type=index说明整个索引树都被扫描了,效果显然不理想。 200S+ 都未查出 explain select pay_date from pss_pay_order where add_time >'2019-03-14 23:59:59' and mark = 0 order by pay_date limit 10; #type=range,说明索引树仅仅被部分扫描,要优于前面那个SQL. 不到5s便可查出 explain select pay_date from pss_pay_order force index(idx_add_time) where add_time >'2019-03-14 23:59:59' and mark = 0 order by pay_date limit 10;
附:explain type:index 与range 区别数据库
range 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪一个索引通常就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,由于他只须要开始索引的某一点,而结束语另外一点,不用扫描所有索引spa
index Full Index Scan,index与ALL区别为index类型只遍历索引树。这一般比ALL快,由于索引文件一般比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)code
总结blog
mysql可能并不总会选择合适且效率高的索引去查询,这时适当的force index(indexname) 强制告诉mysql使用什么索引尤其重要。索引