首页 > 数据库 >SQL 优化(1)

SQL 优化(1)

时间:2023-08-20 22:34:00浏览次数:41  
标签:JOIN 性能 使用 消耗 查询 索引 SQL 优化

SQL Server 查询优化器筛选条件分析 通过筛选条件减少扫描范围 注意项:

  • 模糊查询,尽量不要把百分号放置在前面: LIKE‘%xx’,查询优化器无法对此优化,只能扫描查找(表扫描或索引扫描查找)
  • 尽量避免使用OR(可考虑UNION ALL),扰乱查询优化器流程
  • 避免对列值进行运算,查询不走索引
  • 避免使用 NOT IN,全表扫描
优化慢查询SQL 避免使用SELECT * 查询不需要的字段,消耗数据库资源,甚至内存或CPU资源;返回数据通过网络IO传输过程中,增加数据传输时间;SELECT * 不会走索引会出现大量等待回表操作; 建议:只查询需要的数据列 尽量使用UNION ALL 代替 UNION 使用UNION会过滤重复数据,UNION ALL获取所有数据包含重复数据;排除重复的过程需要遍历、排序和比较,更耗时,更消耗CPU资源 小表驱动大表 子查询in / exist 使用in关键字,它会优先执行in里面的子查询,再执行外面的语句,如果子查询的数据量很少,数据会很快 使用exist关键字,则会优先执行主查询语句(exist左边的语句),然后把它作为条件,去跟右边的语句进行匹配 总结:in适用于左边大表,右边小表;exist适用于左边小表,右边大表 批量操作 每次请求数据库是会消耗一定性能的;批量操作减少性能消耗; 建议:批量操作数据量不要过多,数据量多执行的也慢;建议500ms,数据量多可分多批次处理 高效分页查询 查询结果集过多,查询慢、响应慢,网络传输消耗性能,传输慢(拥堵)、还可能造成接口超时 避免IN中的值过多 用连接查询代替子查询 子查询要创建临时表,查询完成后要删除这些临时表,有一些额外的性能消耗 JOIN的表不宜过多 JOIN的表过多,数据库在选择索引的时候会非常复杂,很容易选错索引;如果没有命中,nested loop join 会分别从两个表读一行数据进行两两对比 建议:JOIN的表不宜超过3个 LEFT JOIN/INNER JOIN 使用INNER JOIN 数据库会自动选择两张表中的小表去驱动大表,性能上不会有太大问题 使用LEFT JOIN,数据库会默认使用LEFT JOIN左边驱动右表 控制索引数量 索引能够显著提升查询SQL的性能,但索引数量并非越多越好;因为表中新增数据时,需要同时为它创建索引,而索引需要额外的存储空间,有一定的性能消耗 建议:单表索引数量尽量控制在5个以内,并且单个索引的字段数不超过5个;数据库使用B+树的结构来保存索引的,在insert\updae\delete需要更新索引,如果索引过多,会消耗很多额外的性能; 能用联合索引就别用单个索引,可删除无用的单个索引 选择合理的字段类型 char 该类型的字段存储空间是固定,存储内容若不是固定的,会浪费存储空间 varchar 表示变长字符串类型,该类型的字段存储空间会根据实际数据的长度调整,不会浪费存储空间 对于查询,在一个相对较小的字段内搜索效率显然要高些 建议:选择字段类型时,能用数字类型,就不用字符串,因为字符串的处理往往比数字要慢,尽可能用小的类型 提升GROUP BY效率 group by 会与having结合使用,分组会消耗性能,要在分组前用where把数据过滤掉在分组,减少性能消耗 索引优化 索引失效常见原因
  • 不满足最左前缀原则
  • 范围索引列没有放最后
  • 使用了select *
  • 索引列上有计算
  • 索引列上使用了函数
  • 类型转换,字符串类型没加引号
  • 使用 is null 和is not null 没注意字段是否允许为空
  • like 查询左边有%
分页查询、分批调用接口、

标签:JOIN,性能,使用,消耗,查询,索引,SQL,优化
From: https://www.cnblogs.com/xjxue/p/17644756.html

相关文章

  • SQL 基础(2)
    casewhen查询SELECTname,course,score,casewhenscore<60then'不及格'whenscore>=60then'及格'whenscore<80andscore>=70'良好'else'优秀'endascolumn_nameFROMtable_nameSELECTname,course,scorecase......
  • 测试使用QT来连接SQLServer并取出表格数据
    测试使用QT来连接SQLServer并取出表格数据添加引用工程文件需要加入 QT+=sql在main.cpp添加头文件引用//添加头文件#include<qdebug.h>#include<QSqlDatabase>#include<QSqlError>#include<QSqlQuery>连接数据库QSqlDatabasedb=QSqlDatabase::addDatabase("QODBC");......
  • MYSQL: length() vs char_length()
     selectlength('€'),char_length('€')-->1,1 LENGTH() returnsthelengthofthe stringmeasuredinbytes.CHAR_LENGTH() returnsthelengthofthe stringmeasuredincharacters.ThisisespeciallyrelevantforUnicode,inwhich......
  • Cause: java.sql.SQLException: Field 'id' doesn't have a default value Field 'id&
    报错内容: 是因为实体类文件中设置主键自增的类型不对导致的,建议再温习一下逐渐自增的类型以及使用方式我自己的实体类里面设置的IdType为auto,但是主键id是char类型的,还不是int数值类型,所以无法设置为自增 这里需要换成IdType.ID_WORKER_STR@ApiModelProperty(......
  • 【数据库】MySQL的一些基础知识
    ALTERTABLE表名DROP属性名删除数据表DROPTABLE数据库名.表名;用户管理创建用户CREATEUSER'username'@'host'IDENTIFIEDBy'password';username:欲创建用户的用户名password:用户密码host:主机地址,例如localhost、192.168.1.1用户删除DROPUSER'username'@......
  • 深入理解数据库索引优化策略
    数据库索引在后端开发中扮演着至关重要的角色,它们能够显著提升查询性能和数据检索效率。然而,在面对大规模数据和复杂查询的情况下,如何优化索引策略成为了一个挑战。本篇博客将深入探讨数据库索引优化策略,涵盖Java和Python的实例,并介绍一些常见的数据库索引类型。索引的重要性索引是......
  • 深入研究高性能数据库连接池的实现原理与优化策略
    在现代的后端应用开发中,数据库连接池是提高性能和可伸缩性的关键组件之一。本文将深入探讨数据库连接池的实现原理,涵盖Java和Python示例,并介绍一些常见的连接池优化策略。数据库连接池的作用数据库连接池是一种维护和管理数据库连接的技术,它通过预先创建一组数据库连接,并将这些连接......
  • 深入理解数据库索引优化策略与原理
    在后端开发领域,数据库索引是优化查询性能的关键因素之一。本文将深入探讨数据库索引的优化策略和原理,重点关注Java与Python开发环境中的实际应用,同时结合Nginx与Elasticsearch等技术,为读者提供深奥的干货内容。1.索引概述与原理数据库索引是一种用于加速数据检索操作的数据结构。......
  • 高效利用Python装饰器优化函数功能与性能
    在后端开发领域,Python作为一门广泛应用的编程语言,为开发人员提供了丰富的工具和库。本文将深入探讨Python装饰器的原理、用法以及如何利用装饰器优化函数的功能和性能。通过结合实际示例,为读者提供关于装饰器的深奥知识和实用代码。1.装饰器概述与原理装饰器是Python中一种强大的......
  • 探索Java中的并发编程:多线程同步与性能优化
    在后端开发领域,Java作为一门强大的编程语言,广泛应用于构建高性能和并发性能强大的应用程序。本文将深入探讨Java中的并发编程,重点关注多线程同步机制与性能优化策略。通过结合实际代码示例,为读者提供关于并发编程的深奥知识和实用方法。1.并发编程概述与原理并发编程是指多个线程......