MySQL性能分析

表设计准则

🐤满足关系数据库的三范式

1NF

  • 是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值
  • 第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库

2NF

  • 要求数据库表中的每个实例或行必须可以被惟一地区分
  • 设置主键

3NF

  • 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
  • 两张表不要重复的字段,通常都是设置外键

🐱‍🏍大表拆小表,有大数据的列单独拆成小表

  • 在一个数据库中,一般不会设计属性过多的表
  • 在一个数据库中,一般不会有超过 500/1000 万数据的表,如果有按需求进行看需不需要拆表
  • 有大数据的列单独拆成小表(富文本编辑器,CKeditor)

DQL 的执行过程

SQL 的执行过程

  • 客户端发送一条查询SQL语句给服务器
  • 服务器通过权限检查之后,先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段
  • 服务器端进行SQL解析、预处理,再由优化器根据该SQL所涉及到的数据表的统计信息进行计算,生成对应的执行计划
  • MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询
  • 将结果返回给客户端

查询优化器

  • 写的任何SQL, 到底是怎么样真正执行的, 按照什么条件查询, 最后执行的顺序, 可能都会有多个执行方案
  • 查询优化器根据对数据表的统计信息 (比如索引, 有多少条数据) 在真正执行一条SQL之前, 会根据自己内部的数据, 进行综合的查询
  • 根据 MySQL 自身的统计信息, 从多种执行方案当中, 选择一个它认为是最优的执行方案, 来去执行

🧎‍♀️做优化做什么

  • 做优化, 就是想让查询优化器按照我们的想法, 帮我们选择最优的执行方案
  • 让优化器选择符合程序员计划的执行语句, 来减少查询过程中产生的 IO

image-20210803195649933

MySQL 常见瓶颈

  • CPU 饱和
  • 磁盘 I/0 读取数据大小
  • 服务器硬件比较底

🐱‍👤如何去判定一个SQL写的好与坏

Explain

查询执行计划

  • 使用 explain 关键字,可以模拟优化器执行的 SQL 语句
  • 从而知道 MySQL 是如何处理 SQL 语句的
  • 通过 Explain 可以分析查询语句或表结构的性能瓶颈

作用

  • 查看表的读取顺序
  • 数据读取操作的操作类型
  • 查看哪些索引可以使用
  • 查看哪些索引被实际使用
  • 查看表之间的引用
  • 查看每张表有多少行被优化器执行
posted @ 2021-08-03 19:58  BNTang  阅读(87)  评论(0编辑  收藏  举报