update更新很慢(字段类型引发)

update更新很慢(字段类型引发)

开发人员在sql审核平台提交了2000多条update语句,每条语句只更新一条,where条件由索引,在sql审核平台在测试执行阶段已经执行了20多分钟。于是让看一下数据库后台线程是不是还在跑。

于是进入到mysql中执行:

mysql> pager grep -v Sleep;

mysql> show processlist;

发现还在跑,下面是经过处理的sql:

UPDATE port SET name = ‘xxx’, tel = ‘121212121212’ WHERE order_id = 052001;

因为该服务器只用来测试阶段使用(就是先在该服务器执行一遍然后回滚,没问题后再去主库执行),所以机器性能并不是很好,如是看了一下IO情况:

update更新很慢(字段类型引发)update更新很慢(字段类型引发)

发现一直是打满的情况,并且iowait也存在,于是开始就怀疑了是IO的问题,于是让开发将2000条sql,先提交100条看看,100条还是很慢,但是其他工单(测试用的同一个服务器)就比较快,于是感觉想的方向不对,开始查看表结构,果然看到了问题:

mysql> select count(*) from port;

大概300w条数据。

mysql> show create table port;

order_id varchar(20) NOT NULL DEFAULT ” COMMENT ‘订单ID’

该条件字段类型为varchar,而update的时候用的是int,没有加引号,所以引发了隐式类型转换,导致不能走索引,进而全表扫描,执行一条大概7s,2000*7/60≈3小时,对于2000条数据是一个比较庞大的一个时间呀!!!

根据官方文档的描述:

update更新很慢(字段类型引发)update更新很慢(字段类型引发)

简单解释一下就是:

① 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

② 如果两个参数都是整数,则将它们作为整数进行比较。

③ 如果其中一个参数是TIMESTAMP或DATETIME列,而另一个参数是常量,则在执行比较之前将常量转换为时间戳。

④在所有其他情况下,参数都作为浮点数(双精度)进行比较。例如,字符串和数字操作数的比较会以浮点数的比较方式进行。

重要的是第④点,我们这里就是因为这个导致的,都进行了隐式转换不能走索引,导致全表扫。

最后,在设计表结构的时候,也要特别注意,要知道以后业务中该字段需要存储什么和使用什么类型的内容,再有查询和修改的时候要确认一下条件的字段类型。

Original: https://www.cnblogs.com/ordinarydba/p/16318074.html
Author: DB文档搬运工
Title: update更新很慢(字段类型引发)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621786/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql主从搭建

    mysql主从搭建 环境:ubuntu20.04.1,mysql:8.0.22。主:192.168.87.3备:192.168.87.6 安装数据库 sudo apt-get in…

    数据库 2023年6月11日
    068
  • 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本。 IO成本:即将数据页从硬盘中读取到内存中的读取时间成本。通常1页就是1.0的成本。 CPU成本:即是…

    数据库 2023年5月24日
    098
  • 线程池系列三:动态修改线程池队列大小

    线程池中的队列要求的是阻塞队列,作用主要是当线程池处理任务能力不足时,队列存储多余的任务,从而起到削峰和缓冲的目的。 可以选择的队列种类很多,如何选择合适的队列应用到自己的线程池中…

    数据库 2023年6月6日
    069
  • Java 线程常用操作

    继Java线程生命周期继续学习Java线程其他常用操作 线程的常用操作 设置线程名字:setName() 获取线程名称:getName() 线程唯一Id:getId() // 自定…

    数据库 2023年6月6日
    074
  • 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点 ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习◉技能提升系列:https://www.showmeai.tech/tutorials/35📘 深度学习实战系列:https://ww…

    数据库 2023年6月14日
    094
  • LeetCode 13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如,罗马数字2写做II,…

    数据库 2023年6月11日
    079
  • Excel文件校验

    工作中,经常存在excel文件的导入导出的相关工作,因此正确的文件格式校验成为必须。不合适的文件校验方式会导致非法文件跳过校验,从而产生不必要的麻烦。比如,通过文件后缀名的方式进行…

    数据库 2023年6月14日
    0131
  • springboot~Cache注解缓存在代码中的获取

    对于springboot中基于方法的缓存Caching来说,我们直接以声明的方式添加,删除这些缓存,而它们在redis这种持久化产品中,通过 value::key的方法组成一个re…

    数据库 2023年6月6日
    085
  • 系统发布springboot项目

    首先把项目终止服务,但这样的做法不是很好,也可以来个配置文件 1.查看运行的java文件有哪些,位置在哪里,端口号是多少 ps -ef | grep java 2.结束端口进程的运…

    数据库 2023年6月6日
    075
  • 赞!7000 字学习笔记,一天搞定 MySQL

    MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制也是逐渐成熟,更重要的是开源免费的。 MySQL是一种关系数据…

    数据库 2023年6月9日
    072
  • 重返MySQL之MySQL基础

    重返MySQL之MySQL基础 本章详细介绍了,什么是数据库,常见的关系型数据库有哪些,什么是MySQL,及MySQL中DDL操作表,DML操作表记录。 1.0 数据库概述 1.1…

    数据库 2023年6月9日
    0135
  • CSS进阶内容——布局技巧和细节修饰

    CSS进阶内容——布局技巧和细节修饰 我们在之前的文章中已经掌握了CSS的大部分内容,但仍有一些内容我们没有涉略,这篇文章就是为了补充前面没有涉及的内容,为我们的知识做出补充并且介…

    数据库 2023年6月14日
    078
  • Map–部分方法

    1.Map.values()方法:获取Map集合中的所有键值对象 获取 Map 集合中的所有键值对象,这些键值对象将存放在另一个集合对象中 2.getOrDefault() 方法 …

    数据库 2023年6月16日
    078
  • 03-MySQL事务

    数据库事务 1、事务特性 1.1、原子性 即不可分割性,事务要么全部被执行,要么就全部不被执行 1.2、一致性 事务的执行使得数据库从一种正确状态转换成另一种正确状态 1.3、隔离…

    数据库 2023年6月16日
    093
  • mysql关于权限

    use db; select user(),database();— 建立账号 create user user1; create user user2@’192,16…

    数据库 2023年6月9日
    064
  • Java并发编程之AQS以及源码解析

    文章目录 概览 实现思路 实现原理 * 源自CLH锁 AQS数据模型 CAS操作 主要方法 * 自定义同步器的实现方法 AQS定义的模板方法 源码解读 * 等待状态释义 AQS获取…

    数据库 2023年6月6日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球