mysql 1.5倍数据量导致20多倍的执行时间?

以下代码,实现对数据进行标记,在某carPlate出现后(第一次设置为2),1小时内再出现标记为无效(设置为1),超过1小时的第一个再设置为2,以此类推。

主要问题在我有若干个表,数据结构、索引都一样,结果在9000万行的表,这个代码执行大概300多秒;
在1.5亿行的表,执行居然要7000多秒,实在是搞不明白,已经加大了
join_buffer_size
key_buffer_size
myisam_sort_buffer_size
sort_buffer_size
等buffer为原来的4倍(改buffer前后都是上边的结果,9000万行就300多秒,1.5亿行就6000-7000秒),不起作用。

SET @lastCarPlate='',@lastCheckTime='',@state=0;

update foreignAna_source_data_cameraPoint_201801NA t
set 
        t.tripState=@state:=case when @lastCarPlate<>t.carPlate or TIMESTAMPDIFF(MINUTE,@lastCheckTime,t.throughTime)>=60 then 2 else 1 end,
        t.tripState=  case when 'x'=(@lastCarPlate:=t.carPlate) or 'x'=( @lastCheckTime:=case when @state=1 then @lastCheckTime else t.throughTime end) then @state else @state end
where t.dataValid>0 and t.cameraPoint_id in (SELECT addressID from baseService_camerapoint_base_info where crange=2)
ORDER BY
    t.dayOfMonth,t.carPlate,t.throughTime;

表结构如下:

CREATE TABLE `NewTable` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`carPlate`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`plateColorTail`  tinyint(4) NOT NULL ,
`cameraPoint_id`  mediumint(9) NOT NULL ,
`throughTime`  datetime NOT NULL ,
`driveDirection`  tinyint(4) NOT NULL ,
`dataValid`  tinyint(4) NOT NULL ,
`dayOfMonth`  tinyint(4) NULL DEFAULT NULL ,
`zoneOfDay`  smallint(6) NULL DEFAULT NULL ,
`tripState`  tinyint(4) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
;

阅读 1.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题