常见的十种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语句性能优化策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL多表查询实例详解【链接查询、子查询等】

    MySQL多表查询实例详解【链接查询、子查询等】

    这篇文章主要介绍了MySQL多表查询,结合实例形式详细分析了mysql多表查询中的链接查询、子查询等相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-12-12
  • Mysql中通过生日计算年龄的多种方法

    Mysql中通过生日计算年龄的多种方法

    本文给大家分享mysql通过生日计算年龄的方法,每一种方法都非常不错,需要的朋友参考下吧
    2018-03-03
  • mysql数据库找不到表的问题及解决

    mysql数据库找不到表的问题及解决

    这篇文章主要介绍了mysql数据库找不到表的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用JDBC从数据库中查询数据的方法

    使用JDBC从数据库中查询数据的方法

    下面小编就为大家带来一篇使用JDBC从数据库中查询数据的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • mysql 5.7.15版本安装配置方法图文教程

    mysql 5.7.15版本安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.15安装配置方法图文教程,更改数据库data的存储路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • MySql总弹出mySqlInstallerConsole窗口的解决方法

    MySql总弹出mySqlInstallerConsole窗口的解决方法

    这篇文章主要介绍了MySql总弹出mySqlInstallerConsole窗口的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 浅析Mysql Join语法以及性能优化

    浅析Mysql Join语法以及性能优化

    在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧,这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。
    2014-05-05
  • mysql仿asp的数据库操作类

    mysql仿asp的数据库操作类

    本文通过实例代码给大家介绍了mysql仿asp的数据库操作类,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2008-04-04
  • CentOS 7下mysql 5.7 安装教程

    CentOS 7下mysql 5.7 安装教程

    这篇文章主要为大家详细介绍了CentOS 7下mysql 5.7 安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Windows下mysql 8.0.28 安装配置方法图文教程

    Windows下mysql 8.0.28 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.28 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论