常见的十种SQL语句性能优化策略详解

 更新时间:2023年10月21日 09:55:09   作者:浪浪山的猿  
这篇文章主要介绍了常见的十种SQL语句性能优化策略详解,SQL语句性能优化是提高数据库查询效率的关键步骤,可以减少查询时间,提高系统响应速度,本文将介绍一些常见的SQL语句性能优化技巧,包括索引的使用、合理的查询条件、避免全表扫描等,需要的朋友可以参考下

SQL语句性能优化策略

1. 为 WHERE 及 ORDER BY 涉及的列上建立索引

对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引

2. where中使用默认值代替null

应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。

为啥建议where中使用默认值代替null,四个原因:

  1. 并不是说使用了is null或者 is not null就会不走索引了,这个跟mysql版本以及查询成本都有关;
  2. 如果mysql优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件 !=,<>,is null,is not null经常被认为让索引失效;
  3. 其实是因为一般情况下,查询的成本高,优化器自动放弃索引的;
  4. 如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点;

3. 慎用 != 或 <> 操作符

MySQL 只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的 LIKE。所以:应尽量避免在 WHERE 子句中使用 != 或 <> 操作符, 会导致全表扫描。

4. 慎用 OR 来连接条件

使用or可能会使索引失效,从而全表扫描; 应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

5. 慎用 IN 和 NOT IN

IN 和 NOT IN 也要慎用,否则会导致全表扫描。对于连续的数值,能用 BETWEEN 就不要用 IN:select id from t where num between 1 and 3。

6. 慎用 左模糊like ‘%…’

模糊查询,程序员最喜欢的就是使用like,like很可能让索引失效。比如:

select id from t where name like‘%abc%' 
select id from t where name like‘%abc'

而select id from t where name like‘abc%’才用到索引。 所以:

  1. 首先尽量避免模糊查询,如果必须使用,不采用全模糊查询,也应尽量采用右模糊查询, 即like ‘…%’,是会使用索引的;
  2. 左模糊like ‘%…’无法直接使用索引,但可以利用reverse + function index的形式,变化成 like ‘…%’;
  3. 全模糊查询是无法优化的,一定要使用的话建议使用搜索引擎,比如 ElasticSearch。

7. WHERE条件使用参数会导致全表扫描

如下面语句将进行全表扫描:

select id from t where num=@num

因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推 迟到 运行时;

它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

所以, 可以改为强制查询使用索引:

select id from t with(index(索引名)) where num=@num

8. 应避免WHERE 表达式操作/对字段进行函数操作

任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等, 应尽量避免在 WHERE 子句中对字段进行表达式操作,应尽量避免在 WHERE 子句中对字段进行函数操作。

如:

select id from t where num/5=100
应改为:
select id from t where num=100*5

应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。 如:

select id from t where substring(name,1,3)=‘abc'

select id from t where datediff(day,createdate,‘2022-11-30')=0

应改为:

select id from t where name like ‘abc%'

select id from t where createdate>=‘2022-11-30' and createdate<‘2022-12-1'

9. 用 EXISTS 代替 IN 是一个好的选择

很多时候用exists 代替in 是一个好的选择

select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)

10. 查询SQL尽量不要使用select *,而是具体字段

最好不要使用返回所有:select * from t ,用具体的字段列表代替 “*”,不要返回用不到的任何字段。select *的弊端:

(1)增加很多不必要的消耗,比如CPU、IO、内存、网络带宽;

(2)增加了使用覆盖索引的可能性;

(3)增加了回表的可能性;

(4)当表结构发生变化时,前端也需要更改;

(5)查询效率低;

到此这篇关于常见的十种SQL语句性能优化策略详解的文章就介绍到这了,更多相关SQL语句性能优化策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • sql语句escape查询数据中含通配字符[ %用法详解

    sql语句escape查询数据中含通配字符[ %用法详解

    这篇文章主要为大家介绍了sql语句escape查询数据中含通配字符[ %用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Ubuntu中MySQL的参数文件my.cnf示例详析

    Ubuntu中MySQL的参数文件my.cnf示例详析

    这篇文章主要给大家介绍了关于Ubuntu中MySQL的参数文件my.cnf的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 一次MySQL启动导致的事故实战记录

    一次MySQL启动导致的事故实战记录

    这篇文章主要给大家介绍了一次MySQL启动导致的事故实战记录,记录了MySQL 启动成功但未监听端口的解决方法,文中给出了详细的解决方法,需要的朋友可以参考下
    2021-09-09
  • 利用Mysql定时+存储过程创建临时表统计数据的过程

    利用Mysql定时+存储过程创建临时表统计数据的过程

    这篇文章主要介绍了利用Mysql定时+存储过程创建临时表统计数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • MySQL处理重复数据的方法

    MySQL处理重复数据的方法

    这篇文章主要介绍了MySQL处理重复数据的方法,处理重复数据包括防止表中出现重复数据、统计重复数据、过滤删除重复数据,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Mysql存储引擎特性总结

    Mysql存储引擎特性总结

    这篇文章主要介绍了Mysql存储引擎特性总结,同时总结了最常用的2种存储引擎的特性,以及各引擎的适用环境,需要的朋友可以参考下
    2014-07-07
  • MySQL查询缓存的小知识

    MySQL查询缓存的小知识

    这篇文章主要介绍了MySQL查询缓存的的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL迁移到Oracle数据库的超详细步骤和方法总结

    MySQL迁移到Oracle数据库的超详细步骤和方法总结

    今天接到一个任务,让我把MySQL中的表与数据移植到Oracle中,所以这里总结下,这篇文章主要给大家介绍了关于MySQL迁移到Oracle数据库的超详细步骤和方法,需要的朋友可以参考下
    2023-11-11
  • mysql视图之确保视图的一致性(with check option)操作详解

    mysql视图之确保视图的一致性(with check option)操作详解

    这篇文章主要介绍了mysql视图之确保视图的一致性(with check option)操作,结合实例形式详细分析了视图的一致性操作原理、实现技巧与操作注意事项,需要的朋友可以参考下
    2019-12-12

最新评论