优化,一直是面试最常问的一个问题。因为从优化的角度,优化的思路,完全可以看出一个人的技术积累。那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么我们怎么优化?

  • 如果请求过多,判定web服务器的压力过大,增加前端的web服务器,做负载均衡
  • 如果请求静态界面不卡了,但是动态数据还是卡,说明MySQL处理的请求太多了,在应用层增加缓存
  • 数据库层其实是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求,所以,我们通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。但是如果请求激增,还是有大量的查询压力到MySQL,这个时候就要想办法解决MySQL的瓶颈了。

总结起来就是,系统优化的第一步事绝对轮不到Mysql 的,之所以会优化mysql那是因为我们已经做好了应用级别的缓存。请求还是太多的情况。

在优化之前,我们首先要知道Mysql的执行流程。

1、当我们请求mysql服务器的时候,MySQL前端会有一个监听,请求到了之后,服务器得到相关的SQL语句,执行之前(虚线部分为执行),还会做权限的判断。

2、通过权限之后,SQL就到MySQL内部,他会在查询缓存中,看该SQL有没有执行过,如果有查询过,则把缓存结果返回,说明在MySQL内部,也有一个查询缓存.但是这个查询缓存,默认是不开启的,这个查询缓存,和我们的Hibernate,Mybatis的查询缓存是一样的,因为查询缓存要求SQL和参数都要一样,所以这个命中率是非常低的(没什么卵用的意思)。

3、如果我们没有开启查询缓存,或者缓存中没有找到对应的结果,那么就到了解析器,解析器主要对SQL语法进行解析。

4、查询优化器,是最关键的东西,我们写任何一条SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它会怎么去执行?它是先执行username = toby还是password = 1?每一条SQL的执行顺序查询优化器就是根据MySQL对数据统计表的一些信息,比如索引,比如表一共有多少数据,MySQL都是有缓存起来的,在真正执行SQL之前,他会根据自己的这些数据,进行一个综合的判定,判断这一次在多种执行方式里面,到底选哪一种执行方式,可能运行的最快.这一步是MySQL性能中,最关键的核心点,也是我们的优化原则。我们平时所讲的优化SQL,其实说白了,就是想让查询优化器,按照我们的想法,帮我们选择最优的执行方案,因为我们比MySQL更懂我们的数据.MySQL看数据,仅仅只是自己收集到的信息,这些信息可能是不准确的,MySQL根据这些信息选了一个它自认为最优的方案,但是这个方案可能和我们想象的不一样。

5、这个执行计划会传给查询执行引擎,执行引擎选择存储引擎来执行这一份传过来的计划,到磁盘中的文件中去查询,这个时候重点来了,影响这个查询性能最根本的原因是什么?就是硬盘的机械运动,也就是我们平时熟悉的IO,所以一条查询语句是快还是慢,就是根据这个时间的IO来确定的.那怎么执行IO又是什么来确定的?就是传过来的这一份执行计划。

通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作)。当读取者完成对表的操作的时候,锁就会被解除。如果写入者正在等待的时候,另一个读取操作到达了,该读取操作也会被阻塞(block),因为默认的调度策略是写入者优先于读取者。当第一个读取者完成操作并解放锁后,写入者开始操作,并且直到该写入者完成操作,第二个读取者才开始操作。

因此要提高MySQL的更新/插入效率,应首先考虑降低锁的竞争,减少写操作的等待时间。

一、INSERT 语句。

基本: INSERT INTO 表名 (字段列表) VALUES (值列表)(值列表)

如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。

可同时插入多条数据记录,REPLACE 和 INSERT 完全一样,可互换。

优化之前的例子:

INSERT INTO SCORE (CHANGE_TYPE,SCORE,USER_ID) VALUES ('师范',10,1);

优化策略:

(1)当我们需要批量插入数据的时候,这样的语句却会出现性能问题。例如说,如果有需要插入100000条数据,那么就需要有100000条insert语句,每一句都需要提交到关系引擎那里去解析,优化,然后才能够到达存储引擎做真的插入工作。上述所说的同时插入多条就是一种优化。(经测试,大概10条同时插入是最高效的)。

优化之后:

INSERT INTO SCORE(CHANGE_TYPE,SCORE,USER_ID) VALUES('师范',10,1),('师范',10,1),('师范',10,1);

(2)将进程/线程数控制在2倍于CPU数目相对合适

(3)采用顺序主键策略(例如自增主键,或者修改业务逻辑,让插入的记录尽可能顺序主键)

(4)考虑使用replace 语句代替insert语句。(REPLACE语句请参考下文,有详细讲述)

二、DELETE 语句

DELETE FROM 表名

truncate 和 delete

1)、truncate 删除速度更快,但是他删除之后不会记录mysql日志,不可以回复数据。

2)、如果没有外键关联,truncate 是先drop 原始表,再创建一个和原始表一样的新表,速度要远远快于 delete 。truncate table 删除表之后,optimize table 尤其重要,特别是大数据数据库,表空间可以得到释放。

3)、表有外键关联的时候,truncate 会逐行删除,如果外键指定级联删除(delete cascade),关联的子表也会会被删除所有表数据。如果外键未指定级联(cascde),truncate table逐行删除数据,如果是父行关联子表行数据,将会报错。

一个大的 DELETE 或 INSERT 操作,要非常小心,因为这两个操作是会锁表的,表一锁住,其他操作就进不来了。因此,我们要交给DBA去拆分,重整数据库策略,比如限制处理1000条。

另外,扩展下删除和索引的联系(关于索引优化,后面的查询优化也会讲解),由于索引需要额外的维护成本;因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的

所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟),然后删除其中无用数据,此过程需要不到两分钟,删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。

三、UPDATE 语句

UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]

例子:UPDATE score SET CHANGE_TYPE='洗澡' where。。。;

(1). 尽量不要修改主键字段。(废话,反正我就从没改过..)

(2). 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。

(3). 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。

(4). 避免UPDATE将要复制到其他数据库的列。

(5). 避免UPDATE建有很多索引的列。

(6). 避免UPDATE在WHERE子句条件中的列。

四、REPLACE 语句

根据应用情况可以使用replace 语句代替insert/update语句。例如:如果一个表在一个字段上建立了唯一索引,当向这个表中使用已经存在的键值插入一条记录,将会抛出一个主键冲突的错误。如果我们想用新记录的值来覆盖原来的记录值时,就可以使用REPLACE语句。

使用REPLACE插入记录时,如果记录不重复(或往表里插新记录),REPLACE功能与INSERT一样,如果存在重复记录,REPLACE就使用新记录的值来替换原来的记录值。使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。

(1)同INSERT

含义一:与普通INSERT一样功能

REPLACE INTO score (change_type,score,user_id) VALUES ('吃饭',10,1),('喝茶',10,1),('喝茶',10,1);

含义二:找到第一条记录,用后面的值进行替换

REPLACE INTO score (id,change_type,score,user_id) VALUES (1,'吃饭',10,1)

此语句的作用是向表table中插入3条记录。如果主键id为1或2不存在就相当于插入语句:

INSERTINTO score (change_type,score,user_id) VALUES (‘吃饭’,10,1),(‘喝茶’,10,1),(‘喝茶’,10,1);

如果存在相同的值则不会插入数据。

(2)replace(object, search, replace),把object中出现search的全部替换为replace。

用法一:并不是修改数据,而只是单纯做局部替换数据返还而已。

SELECT REPLACE('喝茶','茶','喝')//结果: 喝喝123

用法二:修改表数据啦,对应下面就是,根据change_type字段找到做任务的数据,用bb来替换

UPDATE score SET change_type=REPLACE(change_type,'做任务','bb')1

在此,做下对比:UPDATE和REPLACE的区别:

1)UPDATE在没有匹配记录时什么都不做,而REPLACE在有重复记录时更新,在没有重复记录时插入。

2)UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录。也就是说,将所有的字段都更新了。

其实REPLACE更像INSERT与DELETE的结合。

这样的分享会一直持续,只为读者带来思考和帮助,你的关注,点赞和转发是对我最大的支持,感谢。

欢迎关注公众号:java技术情报局,长期分享java技术干货,与我一起进步。

mysql update 几万 非常慢_Mysql优化专题相关推荐

  1. mysql update 几万 非常慢_mysqL update 太慢,求解决方法

    更改mysql配置如下: # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /var/l ...

  2. mysql update 几万 非常慢_面试官:谈谈你对mysql索引的认识?

    引言 大家好,我渣渣烟.我曾经写过一篇<面试官:讲讲mysql表设计要注意啥>,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mys ...

  3. mysql update 几万 非常慢_如何解决mysql 查询和更新速度慢

    在做客户关系管理系统的时候遇到联表查询,速度特别慢,导致页面加载时间过长而出现错误.在上网查询后发现建立索引可以优化查询 在没有建立索引的时候 select c.*,s.* from crm_cu_r ...

  4. MySQL数值扩大一百倍_Mysql优化----一条SQL百倍提升之旅

    在实现业务逻辑的时候,有些复杂一点逻辑会用数据库子查询去实现,但是sql用子查询会带来性能问题,下面就一个例子来说明,怎么优化子查询,来提升查询速度 mysql> desc update t_s ...

  5. mysql update 多表更新_MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  6. mysql update emp set_Mysql数据库性能优化一

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  7. mysql 走索引 很慢_MySQL优化:为什么SQL走索引还那么慢?

    背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 core 分析过程 接手这个问题时现场已经不在了,信息有限,所以我们先从 ...

  8. mysql update 多个字段_MySQL数据库基础

    MySQL基础 今日目标 1. MySQL数据库简单介绍2. MySQL安装和使用3. SQL[重点]语法和关键字,实现对记录的增删改查 一 数据库介绍 1.1 什么是数据库? 存储数据的仓库,本质上 ...

  9. 优化mysql的21个建议_MySQL优化小建议

    MySQL优化小建议 洛逸 发布于 2019-11-04 12:03 背景 "那啥,你过来一下!" "怎么了?我代码都单元测试了的,没出问题啊!"我一脸懵逼跑到 ...

最新文章

  1. Android CheckBox 点击的时候没有效果
  2. 团队项目博客---移山小分队---3
  3. python prophet 预言家预知未来
  4. mysql增量备份具体步骤_记一次mysql全量备份、增量备份的学习过程
  5. ruby on rails 站点
  6. 动手学PaddlePaddle(3):猫脸识别
  7. Python机器学习:多项式回归与模型泛化009LASSO回归
  8. java获取公网ip_动态IP变固定IP,国内IP变海外IP,助力企业数据传输提高工作效率...
  9. FPDF中文应用攻略
  10. MYSQL 用户的操作
  11. bochs运行xp_bochs xp 镜像下载|bochs xp精简版下载_ - 极光下载站
  12. WinForm CefSharp 笔记一(入门篇)
  13. 学了这么久的编程,编程语言创始人你知道几个?
  14. 墨云科技获蓝驰创投数千万元投资,用人工智能升级网络安全服务
  15. c++可视化性能测试
  16. 小马哥-----高仿苹果6 plus刷机拆机多图展示 拆机主板图与开机界面图 6572芯片 v76机型
  17. 学了皮毛,你如何能做Web安全工程师?
  18. UCloud成首个通过乌云认证的云计算平台
  19. linux gre配置,Linux设置gre 隧道
  20. 奇瑞文档云服务器地址,奇瑞文档云服务器地址是多少

热门文章

  1. POJ 1753 Flip Game 简单BFS
  2. JavaScript很牛
  3. iOS 9.0系统策略更新
  4. 关于findViewById返回空指针的错误
  5. [转载] Python round四舍五入精度缺失的解决
  6. [转载] Python中的数学函数,三角函数,随机数函数
  7. 设计高性能大并发WEB系统架构注意点
  8. IDEA创建xml文件
  9. SpringBoot史前简述
  10. vue-resource中文文档