基本场景设定:InnoDB引擎,
一张单表有 300多万条数据,字段为:id(主键)、name、time、value。
试验场一:
-》Mysql语句:SELECT * from gw_yl_real_data where name = '人民广场东街上海路'
-》查询结果:查询数据:50261 ;平均耗时:12.479s
试验场二:
-》Mysql语句:SELECT * from gw_yl_real_data where name in ('人民广场东街上海路','正源街宝湖路',胜利街明达巷',六盘山路正源街',怀远西路北民大附中')
-》查询结果:查询数据:251319;平均耗时:12.528s
试验场三:
-》Mysql语句:SELECT * from gw_yl_real_data where name = '人民广场东街上海路' and time = '2020-11-04 05:29:00'
-》查询结果:查询数据:1;平均耗时:12.327s
试验场四:
-》Mysql语句:SELECT * from gw_yl_real_data where name in ('人民广场东街上海路','正源街宝湖路','胜利街明达巷','六盘山路正源街',怀远西路北民大附中') and time = '2020-11-04 05:29:00'
-》查询结果:查询数据:5;平均耗时:12.467s
试验场五:使用name建立普通索引
-》Mysql语句:SELECT * from gw_yl_real_data where name = '人民广场东街上海路'
-》查询结果:查询数据:50261;平均耗时:12.626s
试验场六:使用name + time建立唯一索引
-》Mysql语句:SELECT * from gw_yl_real_data where name = '人民广场东街上海路'
-》查询结果:查询数据:50261;平均耗时:354.092s
试验场七:使用name + time建立唯一索引
-》Mysql语句:SELECT * from gw_yl_real_data where name = '人民广场东街上海路' and time = '2020-11-04 05:29:00'
-》查询结果:查询数据:1;平均耗时:0.032s
结论:
1.对比试验一和二、试验三和四可知,查询一个或者多个,使用 in 来查询效率并没有降低。
2.对比试验三和七可知,建立唯一组合索引后查询速度显著提高。
3.对比试验一和六可知,不适当的索引反而会拖慢查询速度(原因待确定),试验六中索引被使用,但是查询效率反而极大地降低了。
4.对比试验一和五可知,普通索引对单表查询速度无用。EXPLAIN 分析试验五,发现使用了索引,并且只扫描了104000行,试验一则扫描了全部的3170076行,但是查询速度差不多(原因待确定)。