1、硬件优化

一般来讲,硬件的优化是成本最高效果最差的,服务器性能对数据库的读写能力的影响尤其体现在磁盘I/O上。mysql数据库频繁的CURD操作是十分吃磁盘I/O的,一般可以认为磁盘I/O是硬件方面制约mysql数据库性能的最大因素。
解决方法:目前一般使用RAID0-1磁盘阵列来解决。

2、储存引擎

在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。在百万级数据及更大数据情况下,mysql InnoDB 的索引表现更加优秀! 它的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。

3、通信协议

MySQL客户端/服务端通信协议是“半双工”的:在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。当查询语句很长的时候,需要设置max_allowed_packet参数。尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。

4、查询缓存

(mysql 8.0 版本开始弃用查询缓存)相同的查询语句和查询结果会以键值对的方式缓存在内存中,MySQL查询缓存保存查询返回的完整结果。当查询命中该缓存(完全一样),MySQL会立刻返回结果,跳过了解析、优化和执行截断。任何字符上的不同,例如空格、注释等都会导致缓存的不命中。可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存。命中率低,8.0版本以后已经弃用。

5、表结构优化

5.1、分页、分表&分库

(1)分页。使用Limit查询。但是偏移量越大越缓慢。
(2)垂直/水平分表、分库
对于字段比较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。越小的列查询得越快。

5.2、字段

(1)不使用null(有一定争议),因为null会占据额外的空间;
(2)如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。其中一个缺点是枚举的字符串列表是固定的,添加和删除字符串(枚举选项)必须使用ALTER TABLE(如果只只是在列表末尾追加元素,不需要重建表)。
(3)固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。所以,按照查询速度: char最快, varchar次之,text最慢。

5.3、增加中间表

对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。

5.4、添加索引

(1)索引的建立遵循最左前缀匹配原则。
(2)尽量考虑在where或order 不要后涉及的列上建立索引。
(3)建立索引的列必须是一个单独、独立的列,完全“干净”的列。不能存在任何运算。
(4)多列索引
①当出现多个索引做相交操作时(多个AND条件),通常来说一个包含所有相关列的索引要优于多个独立索引;
②当出现多个索引做联合操作时(多个OR条件),对结果集的合并、排序等操作需要耗费大量的CPU和内存资源,特别是当其中的某些索引的选择性不高,需要返回合并大量数据时,查询成本更高。所以这种情况下还不如走全表扫描。
(5)覆盖索引。如果一个索引包含或者说覆盖所有需要查询的字段的值,那么就没有必要再回表查询。

5.5、优化Union

除非确实需要服务器去重,否则就一定要使用UNION ALL,如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致整个临时表的数据做唯一性检查,这样做的代价非常高。当然即使使用ALL关键字,MySQL总是将结果放入临时表,然后再读出,再返回给客户端。虽然很多时候没有这个必要,比如有时候可以直接把每个子查询的结果返回给客户端。

6、基于查询语句规则的优化

6.1、尽量不使用select * from

table。从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。

6.2、条件化简

①移除不必要的括号
②常量传递
③等值传递
④移除没用的条件
⑤表达式计算。
⑥Having和where合并,having 移到where后面。
⑦常量表检测:查询的表中一条记录没有,或者只有一条记录。使用主键等值匹配或者唯一二级索引列等值匹配作为搜索条件来查询某个表。

6.3、使用limit

①分页查询(但是要考虑偏移量不能太大)
②如果只需要一行数据,使用limit 1

6.4、外连接消除

内连接可能通过优化表的连接顺序来降低整体的查询成本,而外连接却无法优化表的连接顺序

6.5、子查询优化

行子查询时, MYSQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大在 MYSQL中,可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快,如果查询中使用索引的话,性能会更好。连接之所以更有效率,是因为 MYSQL不需要在内存中创建临时表来完成查询工作。

6.6、大表ALTER

TABLE非常耗时,MySQL执行大部分修改表结果操作的方法是用新的结构创建一个张空表,从旧表中查出所有的数据插入新表,然后再删除旧表。尤其当内存不足而表又很大,而且还有很大索引的情况下,耗时更久。

7、使用explain

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。Explain会展示执行计划的具体信息。
比如计算执行计划是否最优会考虑IO成本,CPU成本,内存开销,总时长时间等,但不一定是我们业务场景下要求的最优的执行计划。因此需要借助这个执行计划的分析,去判断应该怎样选择执行计划,改进自己的查询语句以使查询执行起来更高效。

8、缓冲池

磁盘读取文件太慢,跟不上CPU读取速度,因此InnoDB用内存作为缓存。设置缓冲池Buffer Pool。磁盘读写,并不是按需读取,而是按页读取,一次至少读一页数据(一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。
Buffer Pool本质上是InnoDB向操作系统申请的一段连续的内存空间,存放一些页。InnoDB使用了许多链表来管理Buffer Pool。
LRU链表分为young和old两个区域,可以通过innodb_old_blocks_pct来调节old区域所占的比例。首次从磁盘上加载到Buffer Pool的页会被放到old区域的头部,在innodb_old_blocks_time间隔时间内访问该页不会把它移动到young区域头部。在Buffer Pool没有可用的空闲缓存页时,会首先淘汰掉old区域的一些页。
我们可以通过指定innodb_buffer_pool_instances来控制Buffer Pool实例的个数,每个Buffer Pool实例中都有各自独立的链表,互不干扰。
可以通过innodb_buffer_pool_size来调整它的大小。

谈谈MySQL查询优化相关推荐

  1. 谈谈mysql优化_浅谈MySQL SQL优化

    本文首发于个人微信公众号<andyqian>,期待你的关注 前言 有好几天没有写文章了,实在不好意思.之前就有朋友希望我写写MySQL优化的文章.我迟迟没有动笔,主要是因为,SQL优化这个 ...

  2. mysql怎么删除临时表里的数据_谈谈MySQL数据库中临时表的应用

    MySQL在很多情况下都会用到临时表总结一下什么时候会用到临时表 什么是临时表MySQL用于存储一些中间结果集的表临时表只在当前连接可见当关闭连接时Mysql会自动删除表并释放所有空间. 以下讨论的是 ...

  3. MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全

    目录 一.引出问题-MySQL的查询优化: 二.性能下降的原因: 三.索引到底是什么?怎么用? 1.索引操作 查看索引: 删除索引: 创建索引: 说明: 索引命名规范: 2.索引优势: 3.索引劣势: ...

  4. MySQL查询优化-explain

    2019独角兽企业重金招聘Python工程师标准>>> 一.MySQL 查询优化器是如何工作的         MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索 ...

  5. MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  6. mysql慢查询检查流程_简单谈谈MySQL优化利器-慢查询

    慢查询 首先,无论进行何种优化,开启慢查询都算是前置条件.慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标. 检查慢查询是否开启 通过show variables like ' ...

  7. mysql查询优化explain命令详解

    转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...

  8. mysql优化php面试_php面试专题---18、MySQL查询优化考点

    php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...

  9. mysql面试常问 1: 谈谈MySQL表级锁和行级锁

    谈谈MySQL表级锁和行级锁 表级锁与索引无关 行级锁与索引的关系呢??答案是有关系的,但是要具体分析不同情况 主键索引与 行级锁的关系 非主键索引与行级锁的关系 实验如下: CREATE TABLE ...

最新文章

  1. “拖库”防不胜防,如何早做预防?
  2. 不用IIS运行ASP.Net网站
  3. 软件材料填写中的行数统计和代码文本合并
  4. 自学Springboot(一)
  5. java开发手册:线程池不允许使用 Executors 去创建
  6. 驳《IT开发工程师的悲哀》
  7. PIL image.convert('RGB')在数据生成中真的比较好吗?
  8. 读《世界是数字的》有感③
  9. 2.ELK stack 集群 搭建
  10. 5.WEB版QQ多人聊天,带离线留言功能
  11. linux系统lvs技术,Linux 负载均衡二Lvs技术
  12. MFC的运行过程,TheApp对象
  13. dev万能头文件_CSP-J/S考试中是否可以使用万能头文件
  14. 城市级智能网联示范区情况全扫描
  15. PyTorch 单机多GPU 训练方法与原理整理
  16. QtCreator总是崩溃卡死的问题
  17. PS不能直接拖入图片的解决办法
  18. 前后端传参(二)之数组对象
  19. [读论文]弱监督学习的精确 3D 人脸重建:从单个图像到图像集-Accurate 3D Face Reconstruction with Weakly-Supervised Learning:From
  20. unzip和zip指令的使用方法

热门文章

  1. UVa 12325 - Zombie's Treasure Chest(暴力枚举+预处理)
  2. [转]高精度乘法计算
  3. win7建立无线wifi热点的几个常见的问题
  4. 【JavaScript】32_解构对象与对象的解构
  5. SVPWM的一些理解
  6. ipc_perm 详解
  7. OPT机器视觉12月高峰论坛一览表
  8. 怎样提取音频制作手机铃声
  9. eharts树形图数据过多展示全部重叠了,子级过多,不全部展示解决方法
  10. 《2022 大数据技术与架构视频合集》附PPT和文档,限时下载