欢迎来到淼淼之森的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

SQL 调优

  |   0 评论   |   0 浏览

MySQL 的调优也是研发人员需要掌握的一项技能,一般 MySQL 调优有如下图所示的四个纬度。

  • 第一个纬度是针对数据库设计、表结构设计以及索引设置纬度进行的优化;
  • 第二个纬度是对我们业务中使用的 SQL 语句进行优化,例如调整 where 查询条件;
  • 第三个纬度是对 MySQL 服务的配置进行优化,例如对链接数的管理,对索引缓存、查询缓存、排序缓存等各种缓存大小进行优化;
  • 第四个纬度是对硬件设备和操作系统设置进行优化,例如调整操作系统参数、禁用 swap、增加内存、升级固态硬盘等等。

这四个纬度从优化的成本角度来讲,从左到右优化成本逐渐升高;从优化效果角度来看,从右到左优化的效果更高。

对于研发人员来说,前两个纬度与业务息息相关,因此需要重点掌握,后两个纬度更适合 DBA 进行深入学习,简单了解就好。

那么,重点来看前两个纬度,要点如下图所示。

先看到图中左边的模块,关于表结构和索引的优化,应该掌握如下原则。

左边

  • 要在设计表结构时,考虑数据库的水平与垂直扩展能力,提前规划好未来1年的数据量、读写量的增长,规划好分库分表方案。比如设计用户信息表,预计 1 年后用户数据 10亿 条,写 QPS 约 5000,读 QPS 30000,可以设计按 UID 纬度进行散列,分为 4 个库每个库 32 张表,单表数据量控制在 KW 级别。
  • 要为字段选择合适的数据类型,在保留扩展能力的前提下,优先选用较小的数据结构。例如保存年龄的字段,要使用 TINYINT 而不要使用 INT。
  • 可以将字段多的表分解成多个表,必要时增加中间表进行关联。假如一张表有 40~50 个字段显然不是一个好的设计。
  • 一般来说,设计关系数据库时需要满足第三范式,但为了满足第三范式,我们可能会拆分出多张表。而在进行查询时需要对多张表进行关联查询,有时为了提高查询效率,会降低范式的要求,在表中保存一定的冗余信息,也叫做反范式。但要注意反范式一定要适度。
  • 要擅用索引,比如为经常作为查询条件的字段创建索引、创建联合索引时要根据最左原则考虑索引的复用能力,不要重复创建索引;要为保证数据不能重复的字段创建唯一索引等等。不过要注意索引对插入、更新等写操作是有代价的,不要滥用索引,比如像性别这样唯一很差的字段就不适合建立索引。
  • 列字段尽量设置为 not null。MySQL 难以对使用 null 的列进行查询优化,允许 null 会使索引、索引统计和值更加复杂,允许 null 值的列需要更多的存储空间,还需要 MySQL 内部进行特殊处理。

右边

再看到如图右边所示的模块,对 SQL 语句进行优化的原则。

  • 要找到最需要优化的 SQL 语句。要么是使用最频繁的语句,要么是优化后提高最明显的语句,可以通过查询 MySQL 的慢查询日志来发现需要进行优化的 SQL 语句;
  • 要学会利用 MySQL 提供的分析工具。例如使用 Explain 来分析语句的执行计划,看看是否使用了索引,使用了哪个索引,扫描了多少记录,是否使用文件排序等等。或者利用 Profile 命令来分析某个语句执行过程中各个分步的耗时。
  • 要注意使用查询语句是要避免使用 SELECT *,而是应该指定具体需要获取的字段。原因一是可以避免查询出不需要使用的字段,二是可以避免查询列字段的元信息。
  • 是尽量使用 prepared statements,一个是它性能更好,另一个是可以防止 SQL 注入。
  • 是尽量使用索引扫描来进行排序,也就是尽量在有索引的字段上进行排序操作。

最好有过数据库调优经验

例如:明明建立了索引的语句,但是查询效率还是很慢,通过 Explain 分析发现表中有多个索引,MySQL 的优化器选用了错误的索引,导致查询效率偏低,然后通过在 SQL 语句中使用 use index 来指定索引解决。


标题:SQL 调优
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2022/01/14/1642145817171.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道