谈谈SQL的优化经验

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 谈谈SQL的优化经验

前言

SQL调优在项目中是比较常见的,SQL调优不仅仅包括SQL语句的编写,其中还应包括了数据库的表设计,数据库的配置架构(主从复制,读写分离),索引的使用,当然在数据量如果很大的情况下还应包括分库分表这些,今天我们就来谈谈我在开发学习这方面的经验。

SQL调优是指通过对数据库系统中的SQL查询及设计架构进行分析、优化和改进,以提高查询性能、减少资源消耗、降低响应时间、提高系统稳定性和可靠性的过程。

表设计优化

合理的范式设计:根据业务需求和数据特点,进行合理的范式设计,避免数据冗余和不一致性,提高数据存储效率和可靠性。

适当的反范式设计:对于一些需要频繁查询的字段,可以考虑进行反范式设计,将相关字段冗余存储,以减少数据表连接的次数,提高查询性能。

合理选择字段类型:根据实际存储内容选择合适的字段类型,如整型、字符型、日期型等,以减少存储空间浪费和提高数据处理效率。

要根据字段的内容来选择合适的数据类型。对于数值类型的字段,可以根据实际情况选择合适的类型,例如:

  • TINYINT: 用于存储范围较小的整数,通常用于存储布尔值或者状态码等。
  • INT: 用于存储普通整数,通常用于存储计数器、ID等。
  • BIGINT: 用于存储范围较大的整数,通常用于存储较大的计数器、ID等。

对于字符串类型的字段,也需要根据存储内容来选择合适的类型,例如:

  • CHAR: 用于存储定长字符串,适合存储长度固定的字符串,例如国家代码、性别代码等。
  • VARCHAR: 用于存储可变长度字符串,适合存储长度不固定的字符串,例如姓名、地址等。
  • TEXT: 用于存储较大文本数据,适合存储大段文本、文章内容等。

优化索引设计:为常用的查询条件创建合适的索引,以加快查询速度,同时避免过多的索引导致更新性能下降。

优化主键设计:选择合适的主键,避免使用过长或者频繁变动的字段作为主键,以提高数据插入和更新的性能。

索引优化

索引是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

通俗来说, 索引就相当于一本书的目录, 可以根据页码快速查找到指定的内容, 目的就是加快数据库的查询速度,但这也就意味着书中如果要增加一个章节,修改目录是比较麻烦的,使用索引适用于经常查询很少修改的业务

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

1) 顺序访问

  • 顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
  • 顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2) 索引访问

  • 索引访问是通过遍历索引来直接访问表中记录行的方式。
  • 使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
  • 注意: 建立索引后, 查询速度不一定会变快,例如, 你在teacher表中建立了关于id的索引, 如果你按照name查询, 那么查询速度也不会变快,查询得用到你建立的索引

读写分离,主从复制优化

MySQL读写分离是一种常见的数据库架构设计模式,用于解决高并发场景下数据库的性能和可扩展性问题。它通过将读操作和写操作分离到不同的数据库服务器上,实现了负载均衡和提高数据库性能的效果。

在MySQL读写分离模式中,通常有一个主数据库(Master)用于处理写操作,多个从数据库(Slaves)用于处理读操作。主数据库负责接收并处理所有的写请求,然后将写入的数据同步到从数据库。从数据库则负责处理读请求,提供查询功能。

①当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。

②salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。

③当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。

④I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。

⑤SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。

sql语句优化

  • 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免使用in 和not in,会导致引擎走全表扫描
  • 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描
  • 尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描
  • 使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。
  • 避免使用隐式类型转换,否则造成不使用索引
  • 避免使用SELECT *:只选择需要的列,避免不必要的数据传输和处理。
  • 避免使用通配符(*)选择所有列,而是只选择需要的列。使用WHERE子句限制返回的行数,避免不必要的数据传输和处理。
  • 多表关联查询时,小表在前,大表在后
  • 如果是聚合查询,尽量用union all代替union ,union会多一次过滤

MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
188 2
|
3天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
23 11
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
23天前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
23天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
23天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
1月前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
46 3
|
1月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
122 10
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
1月前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
49 0
下一篇
DataWorks