首页 > 数据库 >SQL优化

SQL优化

时间:2024-02-18 18:34:07浏览次数:25  
标签:数据库 查询 索引 SQL 执行 优化

 

SQL执行过程:

  连接建立:

  1. 应用程序连接数据库: 应用程序通过数据库客户端与数据库服务器建立连接。
  2. 认证和授权: 数据库服务器验证应用程序的身份,并根据其权限确定其是否可以执行特定的SQL操作。

  SQL解析:

  1. SQL解析: 数据库服务器接收到应用程序发送的SQL语句,对其进行解析,检查语法和语义的正确性。
  2. 语法检查: 确保SQL语句的语法是正确的,并且符合数据库系统的规范。
  3. 语义分析: 确保SQL语句的语义是正确的,包括表名、列名的存在性和合法性等。

   执行计划生成:

  1. 查询优化器: 数据库系统使用查询优化器根据查询的逻辑和条件生成一个执行计划,确定如何访问数据以满足查询需求。
  2. 执行计划生成: 数据库生成执行计划,确定了查询的执行路径、访问方法和操作顺序。

  数据访问与处理:

  1. 数据访问: 数据库根据执行计划访问存储中的数据,执行查询操作。
  2. 数据处理: 数据库对查询结果进行处理和计算,可能包括排序、聚合、连接等操作,以生成最终的结果集。

  结果返回与连接关闭:

  1. 结果返回: 查询结果被返回给应用程序,可以是单行、多行或空结果集。
  2. 连接关闭: 查询执行完成后,数据库服务器关闭与应用程序的连接,释放资源。

 

1. 查询语句优化:

  • 选择合适的列: 在查询中只选择需要的列,避免使用 SELECT *;查询时请书写需要的字段,这样可以减少数据传输和查询的时间。查询包含的列越少,io开销越小。

  • 避免使用子查询: 尽量避免在查询中使用子查询,尤其是在 WHERE 子句中,可以考虑使用连接(JOIN)来替代子查询,子查询结果会形临时表,增加内存资源。

  • 合理使用条件: 确保查询条件能够充分利用索引,在SQL语句的WHERE与JOIN部分中用得到的字段,都应该用到索引;避免在列上进行函数操作,这样可以使索引失效。表达式运算时,尽量将造作移至等号右侧。尽量使用LIMIT分页,每页数量不宜过大。

  • 查询条件的顺序: 将最限制性的查询条件放在 WHERE 子句的前面,这样可以尽早过滤掉不符合条件的数据,提高查询效率。此外,SQL Server的查询处理器(Parser)会按照 FROM 子句中的表名从右到左的顺序进行处理。这意味着在 FROM 子句中写在最后(右侧)的表(也就是基础表,通常是包含最少记录的表)将首先被处理。在处理多个表的情况下,SQL Server会选择记录条数最少的表作为基础表,以提高查询的效率。故:尽量将数据量少的表放于FROM最右侧。
  • 当 SQL Server 处理多个表时,通常会运用排序(Sort)和合并(Merge)的方式来连接它们,以执行查询操作。

  • 避免使用%通配符: 在查询中使用%通配符可能会导致全表扫描,影响性能,尽量避免在查询中使用LIKE '%value%'这样的模糊查询,尽量使用右模糊查询。

  • 读写分离: 从库读主库写,将读操作路由到专门负责处理读请求的从数据库服务器上,这样可以减轻主数据库服务器的负载,提高系统的负载均衡能力。

2. 索引优化:

  • 创建合适的索引: 根据查询频率和字段选择,针对性的创建;为经常查询的字段创建索引,以加速查询速度。但是不要为所有字段都创建索引,因为索引也会占用额外的存储空间并增加写操作的成本。

  • 选择合适的索引类型: 单列索引、复合索引、唯一索引等不同类型的索引适用于不同的场景,需要根据实际情况进行选择。注意:使用复合(多列)索引时,索引的列顺序需要与查询条件保持一致是很重要的,同时删除不必要的单列索引也是一种优化数据库性能的策略。

  • 避免过多的索引: 过多的索引会增加数据库的维护成本,而且可能导致查询优化器选择错误的索引。

3. 数据库表结构优化:

  • 合理设计表结构: 选择合适的数据类型、字段长度和表关系,避免不必要的冗余数据,确保表的正规化和一致性。如:数据范围较小,可选择 TINYINT 或 SMALLINT 来节省存储空间。如果需要存储更大范围的整数,可以选择 MEDIUMINT 或者 INT

  • 分解大表: 当表过大时,可以考虑对其进行分解,将其拆分成多个表,以减少数据的存储和查询成本。

  • 移除不必要的表:减少数据库执行的流程和资源消耗,减少数据传输和网络带宽消耗。

4. 缓存和预编译语句:

 

  • 使用缓存: 尽量减少数据库查询的次数,可以使用缓存技术将查询结果缓存起来,减少数据库的压力。

      两种常见实现方式,直写式(Write Through)和回写式(Write Back)

  直写式 回写式

工作方式

在数据写入数据库后,立即更新缓存,确保数据库与缓存的一致性。 当有数据要写入数据库时,只更新缓存,然后通过异步批量的方式将缓存数据同步到数据库上。
特点
  • 实现简单,同步性好,易于理解和维护。
  • 保证了数据库与缓存的一致性,避免了数据不一致的问题。
  • 效率较高,因为写操作不需要等待数据库的确认,直接写入缓存,可以减少写操作的延迟。
  • 异步批量同步数据库,减少了数据库访问的次数,提高了性能。
缺点
  • 效率一般,因每次写入数据库都需同步更新缓存,可能会增加写操作的延迟。
  • 可能会降低写操作的吞吐量,特别是在高并发的情况下。
  • 实现较为复杂,需要考虑缓存与数据库之间的一致性问题,可能会导致数据不一致的风险。
  • 可能会出现数据丢失的情况,如果在数据写入缓存后发生系统崩溃或者网络故障,尚未同步到数据库时。

 

 

  • 使用预编译语句: 使用预编译语句(Prepared Statement)可以减少SQL语句的解析时间,提高查询的效率。

5. 监控和调优:

  • 监控数据库性能: 定期监控数据库的性能指标,如查询响应时间、查询执行计划等,及时发现并解决性能瓶颈。

  • 分析查询执行计划: 使用数据库提供的工具分析查询执行计划,优化查询语句,改进索引设计。

6. 数据库统计信息:

  • 收集统计信息: 定期收集数据库的统计信息,包括表的大小、索引的使用情况、查询的执行计划等,以便更好地了解数据库的性能状况,发现潜在的性能问题。

  • 分析数据库统计信息: 分析数据库的统计信息,了解数据库中数据的分布情况和查询的访问模式,有助于优化索引设计和查询语句。

 


 

  使用Explain命令:用于解释(或说明)数据库系统执行查询的方式和计划。它通常返回一个执行计划,显示了数据库系统将如何执行查询以及执行查询时所使用的索引、连接方式等关键信息。

  对于优化查询性能非常有用。

   例-语法:EXPLAIN SELECT username FROM table_a ta INNER JOIN table_b tb ON ta.id = tb.id;

  运行带有 EXPLAIN 命令的查询时,数据库系统不会执行查询,而是返回一个关于查询执行计划的结果集。

  查询执行计划的结果通常包括以下重要信息: 

    • id: 每个查询操作的唯一标识符,通常按照执行顺序递增。
    • select_type: 查询的类型,例如简单查询、联合查询、子查询等。
    • table: 查询涉及的表名。
    • type: 访问表的方式,包括全表扫描、索引扫描、范围扫描等。
    • possible_keys: 可能用于查询的索引列表。
    • key: 实际用于查询的索引。
    • key_len: 索引字段的长度。
    • ref: 显示索引是如何与表中的行匹配的。
    • rows: 估计的结果集行数。
    • Extra: 额外的信息,例如是否使用了临时表、文件排序等。

  通过分析 EXPLAIN 命令的结果,可以更好地理解查询的执行方式,发现潜在的性能瓶颈,并对查询语句进行优化。

 


 

 

7. 优化数据库配置:

  • 调整数据库参数: 根据数据库的实际负载和性能需求,调整数据库的参数设置,包括缓冲池大小、连接数、日志设置等,以优化数据库的性能。

  • 使用分区表: 对于大型数据库表,可以考虑使用分区表来提高查询和维护的效率,可以根据时间、范围或者其它条件进行分区。

8. 考虑并发和事务:

  • 事务优化: 优化事务的范围和持续时间,尽量减少事务的锁定时间和资源占用,以提高并发性和吞吐量。

  • 并发控制: 使用合适的并发控制策略,如乐观并发控制(Optimistic Concurrency Control)或悲观并发控制(Pessimistic Concurrency Control),以避免数据的竞争和冲突。

9. 业务逻辑优化:

  • 优化业务逻辑: 重新评估业务逻辑的设计,考虑是否可以简化复杂的业务流程,减少数据库的负载和开销。

  • 批量操作: 尽量使用批量操作来处理大量数据,减少单次数据库操作的次数,提高数据库的性能和效率。

10. 数据库版本升级:

  • 考虑升级数据库版本: 时刻关注数据库厂商发布的新版本和更新,新版本通常会包含性能优化和改进。升级数据库版本可能会带来性能提升和新特性的支持。

11. 考虑存储引擎:

  • 选择合适的存储引擎: 不同的数据库管理系统可能支持不同的存储引擎,如InnoDB、MyISAM等。了解不同存储引擎的特点和适用场景,选择适合自己业务需求的存储引擎。MyISAM引擎是MySQL 5.1及之前版本的默认引擎;InnoDB在MySQL 5.5后成为默认索引。

12. 使用分析工具:

  • 使用数据库性能分析工具: 借助数据库性能分析工具,可以帮助识别潜在的性能问题和瓶颈,并提供优化建议。常见的数据库性能分析工具包括MySQL的EXPLAIN语句、Percona Toolkit、pt-query-digest等。

13. 定期优化:

  • 定期进行优化: SQL优化不是一次性的工作,需要定期进行审查和优化。随着业务的发展和数据库的变化,不断地进行优化和调整以适应新的需求和挑战。

 

  另外还有表分区:数据库管理中的一种技术;水平拆分(Horizontal Partitioning):数据库设计中的一种技术;垂直拆分(Vertical Partitioning):数据库设计中的一种技术,等等。

 


 

 

SQL生命周期:

  SQL(Structured Query Language)的生命周期是SQL语句从设计、开发、执行到优化的整个过程,涵盖了SQL在数据库系统中的各个阶段的生命周期管理。

1. 需求分析阶段:

  1. 需求收集和分析: 确定业务需求,了解需要查询和操作的数据。
  2. 定义数据模型: 设计数据库结构和关系模型,包括表、列、主键、外键等。

2. SQL设计和开发阶段:

  1. SQL查询设计: 根据需求设计SQL查询语句,包括选择需要的列、定义条件、排序规则等。
  2. SQL编码: 将设计好的SQL查询语句转化为具体的SQL代码,并进行编码实现。

3. SQL执行阶段:

  1. SQL解析: 数据库系统接收SQL查询,并对其进行解析,检查语法和语义的正确性。
  2. 执行计划生成: 数据库系统生成SQL查询的执行计划,确定查询的执行路径和访问方式。
  3. 数据访问和处理: 数据库系统根据执行计划访问数据,并进行逻辑处理和计算,生成结果集。

4. SQL优化和调优阶段:

  1. 性能分析: 监控SQL查询的性能和执行情况,收集执行统计信息。
  2. 查询优化: 根据性能分析结果,对SQL查询进行优化,包括重写查询、创建索引、优化执行计划等。
  3. 索引优化: 根据查询的特性和访问模式,设计和创建合适的索引,提高查询性能和效率。

5. 维护和监控阶段:

  1. 数据库维护: 定期维护数据库系统,包括备份、恢复、数据清理、性能调整等。
  2. 性能监控: 持续监控数据库系统的性能和运行状态,发现并解决潜在的性能问题。

 

标签:数据库,查询,索引,SQL,执行,优化
From: https://www.cnblogs.com/warmNest-llb/p/18019771

相关文章

  • MySQL 添加主键减少磁盘空间的使用
    测试使用的版本:MySQL8.0.32时至今日的MySQL8.3.0,默认都是不需要在定义表的时候定义主键。不过GroupReplication和PerconaXtraDBCluster(PXC)缺省不支持没有主键的表。表缺少主键会有很多负面的性能影响,最大的确定是影响复制的速度。今天,来简单说说使用主键的另一个原......
  • SQL批量更新部分B表的数据,数值来源于A表,根据AB关联字段作为过滤条件
    1.需求描述A表是全数据表,需要批量更新B表制定列的部分数据。条件是B表的另外一列定于A表的另外一列2.实例代码updateBsetcol1=A.col1fromAwhereB.col2=A.col2andb.col2>'2024-01-11';3.代码说明where后面第一份条件是两表的关联关系,第二个条件是对B表更......
  • centos7.6 安装Mysql5.7
    #安装Mysqlwgethttp://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpmyumlocalinstallmysql57-community-release-el7-8.noarch.rpmrpm--importhttps://repo.mysql.com/RPM-GPG-KEY-mysql-2022yumrepolistenabled|grep"mysql.*-community.*"......
  • mysqldump备份
    前言:mysqldump是日常比较常用的一个工具了,在对数据库进行导出工作时,经常会用到mysqldump。本篇文章将介绍mysqldump工具的使用方法并分享几点备份技巧。1.mysqldump使用简介mysqldump是MySQL系统自带的逻辑备份工具,主要用于转储数据库。它主要产生一系列的SQL语句,可......
  • PostgreSQL提示信息乱码
    在win11环境下部署开发环境,安装pgsql16后测试连接正常,系统终端环境下提示信息正常显示。但在vscode中与数据库连接工具中发现数据库返回的提示信息乱码,虽不影响使用但看着实在别扭所以想着处理下。在查阅相关资料后发现,配置文件postgresql.conf中的lc_messages参数值为lc_mes......
  • SQL Server Accelerated Database Recovery调研
    背景  作为RDS for SQL Server团队,我们给用户提供核心的商业数据库服务,而数据库服务的SLA至关重要,而RTO又是数据库SLA的重要部分,但最近对于一些使用大规格实例的GC6以上客户,出现过一些由于重启/HA导致花费较长时间在数据库恢复过程,从而导致长时间服务不可用,严重影响了我们......
  • 简洁高效的短链接:优化互联网体验
    在互联网时代,我们经常遇到需要分享长网址的情况。长网址不仅不美观,而且容易出错或难以记忆。为了解决这个问题,短链接应运而生。本文将介绍短链接的概念、优势以及在互联网体验中的应用,帮助读者更好地了解并利用短链接。短链接|一个覆盖广泛主题工具的高效在线平台(amd794......
  • MySQL字符串截取总结:Left()、Right()、Substring()、Substring_index()
    在实际的项目开发中有时会有对数据库某字段截取部分的需求,这种场景有时直接通过数据库操作来实现比通过代码实现要更方便快捷些,mysql有很多字符串函数可以用来处理这些需求,如Mysql字符串截取总结:left()、right()、substring()、substring_index()。一.从左开始截取字符串用法:le......
  • mysql创建数据库排序规则utf8_general_ci和utf8_unicode_ci区别
    在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢?ci是caseinsensitive,即"大小写不敏感",a和A会在字符判断中会被当做一样的;bin是二进制,a和A会别区别对待。例如你运行:SELECT*FR......
  • SQL索引
     介绍:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构;SQL索引是一种数据结构,用于提高数据库系统对表中数据的查询速度与性能;索引相当于书籍的目录,可以让数据库系统快速定位和访问表中特定的数据行,而不必扫描整个表; 索引通常基于表中一......