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

发布于 2022-09-11 17:43:23 字数 1505 浏览 25 评论 0

以下代码,实现对数据进行标记,在某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`)
)
;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文