我正在使用MySQL 5.6.19社区版,我有一个大表(大约20,000,000行,每天大约250,000个插入)。我正在使用的引擎是InnoDB。
我正在运行一个连接到其他表的查询,根据特定条件过滤和排序数据。我已为此查询创建了一个索引,因为此查询可以运行多次。
此外,我创建了一个每晚运行并“缩小”表格的例程。它可以找到哪些行可以删除,哪些行应该根据业务逻辑进行更新,每晚删除大约150,000行并更新几千行。
现在问题是:
存储的例程完成后,查询执行时间快速(毫秒),但如果例程在很长一段时间内没有运行,或者在数据库重新启动后立即执行,则同一查询需要20秒或更长时间。当执行计划很快且速度很慢时,执行计划看起来完全相同 - 这是执行计划:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stationimp1_ ref_or_null PRIMARY,idx_station_complex_1 idx_station_complex_1 2 const 55 Using where; Using index; Using temporary; Using filesort
1 SIMPLE stationeve0_ ref idx_station_event_log_1,idx_station_event_log_complex_1 idx_station_event_log_complex_1 9 DMS.stationimp1_.id 575 Using index condition
问题是为什么我在执行时间之间有如此巨大的差异,即使例程没有运行,我怎样才能使它更快(例程的删除部分是一个在循环中运行的游标并删除一个接一个150,000行,我的猜测是,在对表进行了如此多的点击后,表被缓存到内存中或以某种方式更容易访问,这就是查询变得非常快的原因)?