返回顶部
首页 > 资讯 > 数据库 >如何给SQL做个优化
  • 830
分享到

如何给SQL做个优化

2024-04-02 19:04:59 830人浏览 泡泡鱼
摘要

本篇内容主要讲解“如何给sql做个优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何给SQL做个优化”吧!SQL 语句执行较慢的 3 个原因没有建立索引,或

本篇内容主要讲解“如何给sql做个优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何给SQL做个优化”吧!

SQL 语句执行较慢的 3 个原因

没有建立索引,或者索引失效导致了 SQL  语句执行较慢

这个应该是比较好理解的,如果数据比较多,在千万级别以上,然后呢又没有建立索引,在这千万级别的数据中查找你想要的内容,简直就是在肉搏啊(哎呦,可了不得,竟然敢肉搏

索引失效这块内容说起来就比较多了,比如在查询的时候,让 like 通配符在前面了,比如经常念叨的“最左匹配原则”,又比如我们在查询条件中使用 or ,而且  or 前后条件中有一个列没有索引,等等这些情况都会导致索引失效

锁等待

常用的存储引擎主要有 InnoDB 和 MyISAM 这两种了,前者支持行和表锁,后者就只支持表锁

如果数据库操作都是基于表锁的话,意思就是说,现在有个更新操作,就会把整张表锁起来,那么查询的操作都不被允许,所以就不要说提高系统的并发性能了

  • 聪明的你肯定就知道了,既然 MyISAM 只支持表锁,那么使用 InnoDB 不就好了?你以为 InnoDB 的行锁不会升级成表锁嘛?too young  too simple !

  • 如果对一张表进行大量的更新操作, Mysql  就觉得你这样用会让事务的执行效率降低,到最后还是会导致性能下降,这样的话,还不如把你的行锁升级成表锁呢

  • 还有一点,行锁可是基于索引加的锁,在执行更新操作时,条件索引都失效了,那么这个锁也会执行从行锁升级为表锁

不恰当的 SQL 语句

这个也比较常见了,啥是不恰当的 SQL 语句呢?就比如,明明你需要查找的内容是 name , age ,但是呢,为了省事,直接  select *,或者在 order by 时,后面的条件不是索引字段,这就是不恰当的 SQL 语句

优化 SQL 语句

在知道了 SQL 语句执行比较慢的原因之后,接下来要做的就是对症下药了

针对 没有索引/索引失效 这块,最有效的办法就是 EXPLaiN 语法了,那你知不知道 Show Profile 也可以嘞

针对 锁等待 这块,没办法了,只能自己多注意

针对 不恰当的 SQL 语句 这块,介绍几个常用的 SQL 优化,比如分页查询怎么优化一下可以查询的更快一些呀,你不是说 select *  不是正确的打开方式嘛?那什么是正确的 select 方式呢?别急嘛,阿粉下面都会说到的

废话不多说,咱们开始了

先来个表

为了确保优化后的结果和我写的一样(起码 90% 是相符的

所以咱们用一样的数据库好不好?乖~

首先建个 demo 的数据库

如何给SQL做个优化

接下来咱们建表,就建个非常简单的表好不好

CREATE TABLE demo.table(  id int(11) NOT NULL,  a int(11) DEFAULT NULL,  b int(11) DEFAULT NULL,  PRIMARY KEY(id) ) ENGINE = INNODB

然后插入 10 万条数据

DROP PROCEDURE IF EXISTS demo_insert; CREATE PROCEDURE demo_insert() BEGIN     DECLARE i INT;    SET i = 1;     WHILE i <= 100000 DO         INSERT INTO demo.`table` VALUES (i, i, i);         SET i = i + 1 ;     END WHILE; END; CALL demo_insert();

OK ,准备工作做好了,接下来开始实战

通过 EXPLAIN 分析 SQL 是怎样执行的

只要说 SQL 调优,那就离不开 EXPLAIN

EXPLAIN SELECT * FROMtableWHERE id < 100 ORDER BY a;

如何给SQL做个优化

咱们能够看到有好几个参数:

  • id :每个执行计划都会有一个 id ,如果是一个联合查询的话,这里就会显示好多个 id

  • select_type :表示的是 select 查询类型,常见的就是 SIMPLE (普通查询,也就是没有联合查询/子查询), PRIMARY  (主查询), UNION ( UNioN 中后面的查询), SUBQUERY (子查询)

  • table :执行查询计划的表,在这里我查的就是 table ,所以显示的是 table, 那如果我给 table 起了别名 a ,在这里显示的就是  a

  • type :查询所执行的方式,这是咱们在分析 SQL 优化的时候一个非常重要的指标,这个值从好到坏依次是: system > const >  eq_ref > ref > range > index > ALL

    • system/const :说明表中只有一行数据匹配,这个时候根据索引查询一次就能找到对应的数据

    • eq_ref :使用唯一索引扫描,这个经常在多表连接里面,使用主键和唯一索引作为关联条件时可以看到

    • ref :非唯一索引扫描,也可以在唯一索引最左原则匹配扫描看到

    • range :索引范围扫描,比如查询条件使用到了 < , > , between 等条件

    • index :索引全表扫描,这个时候会遍历整个索引树

    • ALL :表示全表扫描,也就是需要遍历整张表才能找到对应的行

  • possible_keys :表示可能使用到的索引

  • key :实际使用到的索引

  • key_len :使用的索引长度

  • ref :关联 id 等信息

  • rows :找到符合条件时,所扫描的行数,在这里虽然有 10 万条数据,但是因为索引的缘故,所以扫描了 99 行的数据

  • Extra :额外的信息,常见的有以下几种

    • Using where :不用读取表里面的所有信息,只需要通过索引就可以拿到需要的数据,这个过程发生在对表的全部请求列都是同一个索引部分时

    • Using temporary :表示 mysql 需要使用临时表来存储结果集,常见于 group by / order by

    • Using filesort :当查询的语句中包含 order by 操作的时候,而且 order by  后面的内容不是索引,这样就没有办法利用索引完成排序,就会使用"文件排序",就像例子中给出的,建立的索引是 id , 但是我的查询语句 order by 后面是  a ,没有办法使用索引

    • Using join buffer :使用了连接缓存

    • Using index :使用了覆盖索引

如果对这些参数了解的非常不错,那么 EXPLAIN 这块内容就难不住你了

Show Profile 分析下 SQL 执行性能

通过 EXPLAIN 分析执行计划,只能说明 SQL 的外部执行情况,如果想要知道 mysql  具体是如何查询的,需要通过 Show Profile 来分析

可以通过 SHOW PROFILES; 语句来查询最近发送给服务器的 SQL 语句,默认情况下是记录最近已经执行的 15  条记录,如下图我们可以看到:

如何给SQL做个优化

我想看具体的一条语句,看到 Query_ID 了嘛?然后运行下 SHOW PROFILE FOR QUERY 82;这条命令就可以了:

如何给SQL做个优化

可以看到,在结果中, Sending data 耗时是最长的,这是因为此时 mysql  线程开始读取数据并且把这些数据返回到客户端,在这个过程中会有大量磁盘 I/O 操作

通过这样的分析,我们就能知道, SQL 语句在查询过程中,到底是 磁盘 I/O 影响了查询速度,还是 System lock  影响了查询速度,知道了病症所在,接下来对症下药就容易多了

分页查询怎么可以更快一些在使用分页查询时,都会使用 limit 关键字

但是对于分页查询,其实还可以优化一步

我这里给出的数据库不是太好,因为它太简单了,看不出来有什么区别,我使用目前项目上正在用的表来做个实验,可以看下区别(使用的 SQL 语句如下面):

EXPLAIN SELECT * FROM `te_paper_record` ORDER BY id LIMIT 10000, 20;  EXPLAIN SELECT * FROM `te_paper_record` WHERE id >= ( SELECT id FROM `te_paper_record` ORDER BY id LIMIT 10000, 1) LIMIT 20;

如何给SQL做个优化

上面一张图片,我没有使用子查询,可以看到执行了 0.033s ,下面的查询语句,我使用了子查询去做优化,能够看到执行了 0.007s  ,优化的结果还是很显而易见的

那么,为什么使用了子查询,查询的速度就提上来了呢,这是因为当我们没有使用子查询时,查询到的 10020 行数据都返回回来了,接下来要对这 10020  行数据再进行过滤操作

那可不可以直接就返回需要的 20 行数据呢,这样就不需要再做过滤操作了,直接返回就可以了嘛

你也太聪明了吧。子查询就是在做这件事情

所以查询时间上有了一个很大的优化

正确的 select 打开方式

在查询时,有时为了省事,直接使用 select * from table where id = 1 这样的 SQL  语句,但是这样的写法在一些环境下是会存在一定的性能损耗的

所以最好的 select 查询就是,需要什么字段就查询什么字段

一般在查询时,都会有条件,按照条件查找

这个时候正确的 select 打开方式是什么呢?

如果可以通过主键索引的话, where 后面的条件,优先选择主键索引

为什么呢?这就要知道 MySQL 的存储规则

MySQL 常用的存储引擎有 MyISAM 和 InnoDB , InnoDB 会创建主键索引,而主键索引属于聚簇索引,也就是在存储数据时,索引是基于  B+ 树构成的,具体的行数据则存储在叶子节点

也就是说,如果是通过主键索引查询的,会直接搜索 B+ 树,从而查询到数据

如果不是通过主键索引查询的,需要先搜索索引树,得到在 B+ 树上的值,再到 B+ 树上搜索符合条件的数据,这个过程就是“回表”

很显然,回表能够产生时间。

这也是为什么建议, where 后面的条件,优先选择主键索引

其他调优

看完上面的,心里应该就大概有数了, SQL 调优主要就是建立索引/防止产生锁等待/使用恰当的 SQL 语句去查询

但是,如果问你除了索引,除了上面这些手段,还有没有其他调优方式

啥?竟然还有?!

有的,这就需要跳出来,不要局限在具体的 SQL 语句上了,需要在数据库设计之初就考虑好

比如说,我们常说的要遵循三范式,但是在有的业务场景里面,如果在数据库里面多几个冗余字段的话,可能要比严格遵循三范式带来的性能要好很多。

到此,相信大家对“如何给SQL做个优化”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: 如何给SQL做个优化

本文链接: https://lsjlt.com/news/62050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何给SQL做个优化
    本篇内容主要讲解“如何给SQL做个优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何给SQL做个优化”吧!SQL 语句执行较慢的 3 个原因没有建立索引,或...
    99+
    2024-04-02
  • SQL如何优化
    这篇文章主要介绍SQL如何优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、存在问题经过sql慢查询的优化,我们系统中发现了以下几种类型的问题:1.未建索引:整张表没有建索引;2...
    99+
    2024-04-02
  • 如何优化SQL
    这篇文章主要介绍了如何优化SQL,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简介虽然使用Explain不能够马上调优我们的SQL,它也不能...
    99+
    2024-04-02
  • 如何做好SEO优化
    小编给大家分享一下如何做好SEO优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、重新认识关键词密度关键词密度就是关键词seo在文章中出现的次数。如果是为优化...
    99+
    2023-06-10
  • 【MySQL】sql如何优化?
    一、优化步骤 (1)通过SQL监控、请求、日志等找出耗时的SQL语句; (2)使用Explain方式查看SQL耗时的具体原因; (3)根据实际情况解决:索引、缓存、左右连接 二、Explain select_type:简单查询or复杂查询?...
    99+
    2023-09-16
    sql mysql 数据库
  • SEO如何做图片优化
    本篇内容主要讲解“SEO如何做图片优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SEO如何做图片优化”吧!1、图片的尺寸和大小运用图片的时候应注意图片的大小和尺寸,百度在搜索结果页展示图片的...
    99+
    2023-06-10
  • 如何做好网站优化
    要做好网站优化,可以按照以下步骤进行:1. 关键词研究:确定网站的关键词,通过关键词研究工具分析用户搜索习惯和竞争情况,选择合适的关...
    99+
    2023-09-09
    网站
  • redis如何做内存优化
    为了优化 redis 内存使用,可以采取以下措施:使用合适的数据结构,例如散列表、列表、压缩列表或哈希表。启用压缩功能以压缩重复数据。使用对象共享来存储相似的对象。限制键的数量并使用哈希...
    99+
    2024-06-12
    redis 数据丢失
  • 如何实现SQL优化
    这篇文章主要介绍“如何实现SQL优化”,在日常操作中,相信很多人在如何实现SQL优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现SQL优化”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • 如何优化SQL语句
    这篇文章主要介绍“如何优化SQL语句”,在日常操作中,相信很多人在如何优化SQL语句问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化SQL语句”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • 如何优化SQL查询
    本篇文章给大家分享的是有关如何优化SQL查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们致力于打造能够较好运行并延续较长一段时间的que...
    99+
    2024-04-02
  • Flask中如何优化SQL
    这篇文章主要介绍“Flask中如何优化SQL”,在日常操作中,相信很多人在Flask中如何优化SQL问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flask中如何优化SQL”...
    99+
    2024-04-02
  • sql如何进行优化
    如何优化 sql 查询 优化 SQL 查询的步骤: 1. 分析查询 找出需要优化的高耗时查询。 使用 EXPLAIN 命令来查看查询执行计划。 识别查询中的瓶颈,例如表扫描、索引扫描或...
    99+
    2024-06-21
  • MySQL中如何做好Limit优化
    小编给大家分享一下MySQL中如何做好Limit优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  建议一:灵活使用Limit...
    99+
    2024-04-02
  • 如何优雅地给妹子优化电脑(Windows)?
    能力越大,责任也就越大作为一个懂电脑的BOY。平常被姑娘问的最多一句话就是:我电脑出问题了,快帮我看一看。而作为标准回答。往往也只有一句:你重启一下试试。后来的事实证明这样做其实不好。因为这句话效率过高。导致姑娘们再没有什么事会联系你。怎么...
    99+
    2023-07-26
  • 8个sql优化的案例
    SQL语句的执行顺序: 1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type、 name、 create_...
    99+
    2023-09-01
    sql 数据库 mysql
  • 如何做出一个优秀的数据可视化大屏?
    众所周知, 未来的数据可视化趋势已成为了必然性,越来越多的企业、政府等的应用场景应用 都 会普及 ,销售、教育、医疗、贸易等行业领域也涉及广泛 ,根据实时的监控数据,把最新的数据展现在大屏幕上...
    99+
    2024-04-02
  • SQL优化很难怎么办?给你一个简单暴力的办法
    今天给大家带来一个比较简单SQL优化案例,来分析一下开发人员经常感到不解一个问题——视图合并导致的SQL变慢 例如: 一个运维人员(这里的运维指的是,在现有的系统上,进行稍微修改) 因为业务上的改变,在原有的SQL上添加了一个条件,结果原...
    99+
    2022-04-27
    SQL优化很难怎么办?给你一个简单暴力的办法
  • 如何进行SQL优化中的limit分页优化
    如何进行SQL优化中的limit分页优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。示例 表aaaaa中共有2375690数据。优化前的S...
    99+
    2024-04-02
  • 如何解析MySQL性能优化中的SQL优化
    如何解析MySQL性能优化中的SQL优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注:以 MySQL 为背景,很多内容同时适用于其他关系型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作