前言:我们先了解一下sql性能优化

性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段。而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务繁忙,重则导致应用不可用。它对我们来说就像一颗即将被引爆的定时炸弹一样,时刻威胁着我们。因此在上线项目之前需要严格的把关,以确保 MySQL 能够以最优的状态进行运行。

MySQL 的优化方案有哪些?

MySQL 数据库常见的优化手段分为三个层面:SQL 和索引优化、数据库结构优化、系统硬件优化等,然而每个大的方向中又包含多个小的优化点,下面我们具体来看看。

优化注意事项:

依据数据而不是凭空猜测忌过早优化忌过度优化深入理解业务性能优化是持久战选择合适的衡量指标、测试用例、测试环境

优化目标

(1)减少 IO 次数

IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。

(2)降低 CPU 计算
除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标

优化方案1: SQL 和索引优化

(1)使用正确的索引

索引是数据库中最重要的概念之一,也是提高数据库性能最有效的手段之一,它的诞生本身就是为了提高数据查询效率的,就像字典的目录一样,通过目录可以很快找到相关的内容。我们应该尽可能的使用主键查询,而非其他索引查询,因为主键查询不会触发回表查询,因此节省了一部分时间,变相的提高了查询的性能。

索引类型:普通索引、主键索引、唯一索引、组合索引、全文索引

假如我们没有添加索引,那么在查询时就会触发全表扫描,因此查询的数据就会很多,并且查询效率会很低,为了提高查询的性能,我们就需要给最常使用的查询字段上,添加相应的索引,这样才能提高查询的性能

(2)sql书写时的注意

在 MySQL 5.0 之前的版本要尽量避免使用 or 查询

可以使用 union 或者子查询来替代,因为早期的 MySQL 版本使用 or 查询可能会导致索引失效,在 MySQL 5.0 之后的版本中引入了索引合并,简单来说就是把多条件查询,比如 or 或 and 查询的结果集进行合并交集或并集的功能,因此就不会导致索引失效的问题了。如果限制条件中其他字段没有索引,尽量少用or。
避免在 where 查询条件中使用 != 或者 <> 操作符,因为这些操作符会导致查询引擎放弃索引而进行全表扫描。

适当使用前缀索引
MySQL 是支持前缀索引的,也就是说我们可以定义字符串的一部分来作为索引。我们知道索引越长占用的磁盘空间就越大,那么在相同数据页中能放下的索引值也就越少,这就意味着搜索索引需要的查询时间也就越长,进而查询的效率就会降低,所以我们可以适当的选择使用前缀索引,以减少空间的占用和提高查询效率。
要尽量避免使用 select *,而是查询需要的字段,这样可以提升速度,以及减少网络传输的带宽压力。

关于JOIN优化
尽量使用 Join 语句来替代子查询,因为子查询是嵌套查询,而嵌套查询会新创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,但 Join 语句并不会创建临时表,因此性能会更高。

我们要尽量使用小表驱动大表的方式进行查询

也就是如果 B 表的数据小于 A 表的数据,那执行的顺序就是先查 B 表再查 A 表。
不要在列字段上进行算术运算或其他表达式运算,否则可能会导致查询引擎无法正确使用索引,从而影响了查询的效率。

增加冗余字段可以减少大量的连表查询

因为多张表的连表查询性能很低,所有可以适当的增加冗余字段,以减少多张表的关联查询,这是以空间换时间的优化策略。
避免类型转换,这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换。

尽量用 union all 代替 union

union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

尽量少排序 order by

排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL 的响应时间。如果排序字段没有用到索引,就尽量少排序。

SQL语句中IN包含的值不应过多

MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。

当只需要一条数据的时候,使用limit 1,这是为了使EXPLAIN中type列达到const类型。
区分in和exists, not in和not exists。
使用合理的分页方式以提高分页的效率。

分段查询
避免在 where 子句中对字段进行 null 值判断
不建议使用%前缀模糊查询,如果使用%前缀来模糊查询,建议使用全文索引。

对于联合索引来说,要遵守最左前缀法则
比如:组合索引(a,b,c)三列,我们可以使用(a)、(a,b)、(a,c)、(b、c)、(a,b,c)但是不能以(b,a)、(c,a)、(c,b)等组合使用否则导致索引失效。
必要时可以使用force index来强制查询走某个索引。

文章最后:

以上这些优化方案我们都可以通过 慢查询机制 EXPLAIN方式来验证。


EXPLAIN各个字段详介绍:

type字段值如下:

常见的MySQL优化方案1相关推荐

  1. mysql 常用优化方案_项目中常用的 19 条 MySQL 优化方案

    声明一下:下面的优化方案都是基于 " Mysql-索引-BTree类型 " 的 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单 ...

  2. Kafka常见痛点及优化方案

    文章目录 1.集群木桶效应,broker雪崩 2.集群扩容无法自动负载均衡 3.集群副本迁移影响集群稳定,迁移任务不可控 4.异常流量打挂集群 5.一个业务异常影响整个集群稳定 6.pagecache ...

  3. 大牛是怎么思考设计MySQL优化方案

    在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已. 1.优化的哲学 注:优化有风险,涉足需谨 ...

  4. mysql产品优化方案,MySQL优化方案

    标签: 插入数据 1.批量插入 1).尽量使用多个值表的INSERT语句,这种方式将大大缩减客户端与数据库之间的连接.关闭等消耗 insert into test values(1,2),(1,3), ...

  5. MySQL索引(二)索引优化方案有哪些

    在上一篇文章中,我们介绍了MySQL中常见的索引类型以及每种索引的各自特点,那么这篇文章带你来与我一起看一下聚集索引与二级索引的关系,最后在附上常见的索引优化方案.首先我们还是看一下聚集索引和二级索引 ...

  6. mysql产品优化方案_mysql的优化方案

    简介 在本文中,主要写一下自己所查阅和理解的mysql优化方案. 我的理解是数据库的优化对于我们'非专业'人员,mysql的优化也没那么复杂了,真的要玩转mysql的话,肯定得需要很多年的经验了. 参 ...

  7. 分布式专题-数据库分库分表之Mycat01-数据库性能优化方案

    目录导航 前言 为什么要分库分表 数据库性能瓶颈主要原因 数据性能优化方案 SQL 与索引 表与存储引擎 架构 配置 操作系统与硬件 架构演进与分库分表 单应用单数据库 多应用单数据库 多应用独立数据 ...

  8. 基于Vue-SSR优化方案归纳总结

    Vue-SSR相信大家都不陌生,与传统 SPA 相比,服务器端渲染 (SSR) 能够具备更好的SEO,方便搜索引擎爬虫抓取工具可以直接查看完全渲染的页面,除此之外,SSR能够在更短的时间内渲染出页面内 ...

  9. MySQL 优化 —— SQL优化概述(优化专题开篇词)

    引言 最近为了研究索引的知识,特地去MySQL 官网研读了一番,发现MySQL官网有比较全面的MySQL优化方案和知识背景,所以希望通过一系列文章,将官网的知识翻译总结一下,避免日后去网上胡乱搜索产生 ...

最新文章

  1. 反弹模型(bounce model)----adot, H, Hdot变化图
  2. Oracle数据库的下载和安装
  3. 【MATLAB】绘图技巧(4)——网格线与边框线控制
  4. java报告(一)编程打印一个三角形的乘法口诀表
  5. 面试官:使用SpringBoot如何开发邮件发送系统?
  6. 【高校宿舍管理系统】第六章 用户管理和年级管理
  7. 原生sql的各种问题
  8. 01-python进阶-拾遗
  9. UML(Unified Modeling Language)统一建模语言--类图详解
  10. 【问题解决】解决创建Android模拟器时提示“No system images installed for this target“的问题
  11. 《javascript高级程序设计》读书笔记——作用域
  12. 易语言技术-内存读写监视窥探技术
  13. HAMA 混合信道接入Ad-Hoc,分布式TDMA 协议
  14. 用纯CSS写一个左右滑动的开关按钮
  15. SQL48 将所有获取奖金的员工当前的薪水增加10%
  16. 人工智能:声纹相关基础概念介绍
  17. 案例:js简单实现关闭淘宝二维码
  18. WORD中如何删除掉某几页的页眉和页脚
  19. 【操作系统】FIFO先进先出页面置换算法(C语言实现)
  20. 从一道题学习SoapClient与CRLF组合拳

热门文章

  1. uniapp判断当前运行环境 app h5 微信小程序
  2. 高斯判别分析- GDA原理简介
  3. C++ OpenCV 基于HSV颜色分割区域、获取目标
  4. 小学学校计算机里的单机游戏,15年前的农村小网吧,那个时候只能玩这些单机游戏...
  5. 视频号5种提高曝光量的技巧
  6. opencv产生随机数
  7. 5、迪米特法则(Law of Demeter)
  8. macbook pro能搜索到wifi,但是连接不上
  9. 性能:到底什么是性能测试
  10. 小论文投稿经历与经验