iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何解析MySQL性能优化中的SQL优化
  • 745
分享到

如何解析MySQL性能优化中的SQL优化

2024-04-02 19:04:59 745人浏览 薄情痞子
摘要

如何解析Mysql性能优化中的sql优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注:以 mysql 为背景,很多内容同时适用于其他关系型

如何解析Mysql性能优化中的sql优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

注:以 mysql 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础

  • 优化目标

    1. 减少 io 次数
      IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。

    2. 降低 CPU 计算
      除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标

  • 优化方法

    1. 改变 SQL 执行计划
      明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标

  • 常见误区

    1. count(1)和count(primary_key) 优于 count(*)
      很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,应为数据库对 count(*) 计数操作做了一些特别的优化。

    2. count(column) 和 count(*) 是一样的
      这个误区甚至在很多的资深工程师或者是 DBA 中都普遍存在,很多人都会认为这是理所当然的。实际上,count(column) 和 count(*) 是一个完全不一样的操作,所代表的意义也完全不一样。
      count(column) 是表示结果集中有多少个column字段不为空的记录
      count(*) 是表示整个结果集有多少条记录

    3. select a,b from … 比 select a,b,c from … 可以让数据库访问更少的数据量
      这个误区主要存在于大量的开发人员中,主要原因是对数据库的存储原理不是太了解。
      实际上,大多数关系型数据库都是按照行(row)的方式存储,而数据存取操作都是以一个固定大小的IO单元(被称作 block 或者 page)为单位,一般为4KB,8KB… 大多数时候,每个IO单元中存储了多行,每行都是存储了该行的所有字段(lob等特殊类型字段除外)。
      所以,我们是取一个字段还是多个字段,实际上数据库在表中需要访问的数据量其实是一样的。
      当然,也有例外情况,那就是我们的这个查询在索引中就可以完成,也就是说当只取 a,b两个字段的时候,不需要回表,而c这个字段不在使用的索引中,需要回表取得其数据。在这样的情况下,二者的IO量会有较大差异。

    4. order by 一定需要排序操作
      我们知道索引数据实际上是有序的,如果我们的需要的数据和某个索引的顺序一致,而且我们的查询又通过这个索引来执行,那么数据库一般会省略排序操作,而直接将数据返回,因为数据库知道数据已经满足我们的排序需求了。
      实际上,利用索引来优化有排序需求的 SQL,是一个非常重要的优化手段
      延伸阅读:MySQL ORDER BY 的实现分析 ,MySQL 中 GROUP BY 基本实现原理 以及 MySQL DISTINCT 的基本实现原理 这3篇文章中有更为深入的分析,尤其是第一篇

    5. 执行计划中有 filesort 就会进行磁盘文件排序
      有这个误区其实并不能怪我们,而是因为 MySQL 开发者在用词方面的问题。filesort 是我们在使用 explain 命令查看一条 SQL 的执行计划的时候可能会看到在 “Extra” 一列显示的信息。
      实际上,只要一条 SQL 语句需要进行排序操作,都会显示“Using filesort”,这并不表示就会有文件排序操作。
      延伸阅读:理解 MySQL Explain 命令输出中的filesort,我在这里有更为详细的介绍

  • 基本原则

    • 人为在column_name 上通过转换函数进行转换
      直接导致 MySQL(实际上其他数据库也会有同样的问题)无法使用索引,如果非要转换,应该在传入的参数上进行转换

    • 由数据库自己进行转换
      如果我们传入的数据类型和字段类型不一致,同时我们又没有做任何类型转换处理,MySQL 可能会自己对我们的数据进行类型转换操作,也可能不进行处理而交由存储引擎去处理,这样一来,就会出现索引无法使用的情况而造成执行计划问题。

    • 上面误区中提到的通过利用索引来排序的方式进行优化

    • 减少参与排序的记录条数

    • 非必要不对数据进行排序

    1. 尽量少 join
      MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

    2. 尽量少排序
      排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL 的响应时间。
      对于MySQL来说,减少排序有多种办法,比如:


    3. 尽量避免 select *
      很多人看到这一点后觉得比较难理解,上面不是在误区中刚刚说 select 子句中字段的多少并不会影响到读取的数据吗?
      是的,大多数时候并不会影响到 IO 量,但是当我们还存在 order by 操作的时候,select 子句中的字段多少会在很大程度上影响到我们的排序效率,这一点可以通过我之前一篇介绍 MySQL ORDER BY 的实现分析 的文章中有较为详细的介绍。
      此外,上面误区中不是也说了,只是大多数时候是不会影响到 IO 量,当我们的查询结果仅仅只需要在索引中就能找到的时候,还是会极大减少 IO 量的。

    4. 尽量用 join 代替子查询
      虽然 Join 性能并不佳,但是和 MySQL 的子查询比起来还是有非常大的性能优势。MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。

    5. 尽量少 or
      当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 uNIOn all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

    6. 尽量用 union all 代替 union
      union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

    7. 尽量早过滤
      这一优化策略其实最常见于索引的优化设计中(将过滤性更好的字段放得更靠前)。
      在 SQL 编写中同样可以使用这一原则来优化一些 Join 的 SQL。比如我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,然后再用分好页的结果集与另外的表 Join,这样可以尽可能多的减少不必要的 IO 操作,大大节省 IO 操作所消耗的时间。

    8. 避免类型转换
      这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换:


    9. 优先优化高并发的 SQL,而不是执行频率低某些“大”SQL
      对于破坏性来说,高并发的 SQL 总是会比低频率的来得大,因为高并发的 SQL 一旦出现问题,甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量 IO 而且响应很慢的 SQL,由于频率低,即使遇到,最多就是让整个系统响应慢一点,但至少可能撑一会儿,让我们有缓冲的机会。

    10. 从全局出发优化,而不是片面调整
      SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的 SQL,尤其是在通过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。

    11. 尽可能对每一条运行在数据库中的SQL进行 explain
      优化 SQL,需要做到心中有数,知道 SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后,很明显的问题 SQL 可能已经很少了,大多都需要去发掘,这时候就需要进行大量的 explain 操作收集执行计划,并判断是否需要进行优化。

作者:Sky.Jian | 可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 
链接:Http://isky000.com/database/mysql-perfORMance-tuning-sql


博主附:
第8点曾经在eygle的dba-notes中提到过。(在Oracle DB中仍然有效)

主要问题是通过连接访问新闻页面及其缓慢,通常需要数十秒才能返回。

查询v$session视图,获取进程信息:
SQL> select sid,serial#,username from v$session where username is not null;
如何解析MySQL性能优化中的SQL优化


对相应会话启用sql_trace跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(7,284,true)
SQL> exec dbms_system.set_sql_trace_in_session(11,214,true)
SQL> exec dbms_system.set_sql_trace_in_session(16,1042,true)

执行一段时间后,关闭:
SQL> exec dbms_system.set_sql_trace_in_session(7,284,false)
SQL> exec dbms_system.set_sql_trace_in_session(11,214,false)
SQL> exec dbms_system.set_sql_trace_in_session(16,1042,false)

检查trace文件,可以找到跟踪过程中前台执行的sql调用,检查发现以下语句是可疑的性能瓶颈点:
select auditstatus,cateGoryid,auditlevel from
categoryarticleassign a,category b where b.id=a.categoryid
and articleId=20030700400141 and auditstatus>0

如何解析MySQL性能优化中的SQL优化

这里的查询是根据articleId进行新闻读取的,但是注意到逻辑读有3892,这是一个较高的数字,这个内容引起了我的注意。
接下来的类似查询跟踪得到的执行计划显示,全表访问被执行:

如何解析MySQL性能优化中的SQL优化

然后检查表结构,查看是否存在有效索引,以下输出的idx_articleid给予articleid创建,但在以下查询中都没有被用到 
SQL> select index_name,table_name,column_name from user_ind_columns
2 where table_name=upper('categoryarticleassign');
如何解析MySQL性能优化中的SQL优化

检查发现表结构如下:
如何解析MySQL性能优化中的SQL优化

此时发现articleid为varchar2类型,而查询中给出的articleid=20030700400141是一个number型,oracle发生了潜在的数据类型转换,从而导致了索引失效。

解决方法很简单,只要将articleid加上一个单引号即可。

看完上述内容,你们掌握如何解析MySQL性能优化中的SQL优化的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: 如何解析MySQL性能优化中的SQL优化

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解析MySQL性能优化中的SQL优化
    如何解析MySQL性能优化中的SQL优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注:以 MySQL 为背景,很多内容同时适用于其他关系型...
    99+
    2022-10-19
  • MySQL数据库性能优化之SQL优化的示例分析
    这篇文章将为大家详细讲解有关MySQL数据库性能优化之SQL优化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  注:这篇文章是以 MySQL 为背景,很多内容...
    99+
    2022-10-19
  • MySQL优化之二:My SQL Server性能优化
    1 安装优化一般说来,系统功能越多越复杂,性能就会越差。因此在编译安装MySQL时,仅安装需要的功能模块。如存储引擎、需要的字符集等,让系统尽可能的简单。2 日志设置优化由于日志记录直接带来的性能损耗就是数...
    99+
    2022-10-18
  • 如何理解SQL Server SQL性能优化中的参数化
    如何理解SQL Server SQL性能优化中的参数化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库参数化的模式数据库的...
    99+
    2022-10-19
  • MySQL优化 - 性能分析与查询优化
    MySQL优化 - 性能分析与查询优化    优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根...
    99+
    2022-10-18
  • 如何优化MySQL数据库中的SQL语句性能?
    如何优化MySQL数据库中的SQL语句性能?概述:MySQL是目前最常用的关系型数据库管理系统之一,它的性能影响着许多应用程序的运行效率。在开发和维护MySQL数据库时,优化SQL语句的性能是至关重要的。本文将介绍一些优化MySQL数据库中...
    99+
    2023-12-17
    MySQL 优化 SQL语句性能
  • 如何优化MYSQL性能
    本篇文章给大家分享的是有关如何优化MYSQL性能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  1. MySQL性能优化简介  在Web应用...
    99+
    2022-10-18
  • MySQL如何优化性能
    本文小编为大家详细介绍“MySQL如何优化性能”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL如何优化性能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。- MySQL服...
    99+
    2022-10-19
  • 【MySQL】sql如何优化?
    一、优化步骤 (1)通过SQL监控、请求、日志等找出耗时的SQL语句; (2)使用Explain方式查看SQL耗时的具体原因; (3)根据实际情况解决:索引、缓存、左右连接 二、Explain select_type:简单查询or复杂查询?...
    99+
    2023-09-16
    sql mysql 数据库
  • MySQL性能优化的案例分析
    这篇文章主要介绍MySQL性能优化的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言MySQL索引底层数据结构与算法MySQL性能优化原理-前篇实践(1)--MySQL性能...
    99+
    2022-10-18
  • MySQL limit性能分析与优化
    一、结论 语法结构: limit offset, rows 结论:rows 相同条件下,offset 值越大,limit 语句性能越差 二、测试 执行测试: 5750000 条数据 sql 1 执行时间:...
    99+
    2022-10-18
  • SQL性能优化的示例
    小编给大家分享一下SQL性能优化的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL性能优化1、SELECT 语句...
    99+
    2022-10-18
  • mysql的性能该如何优化
    下文给大家带来有关mysql的性能该如何优化内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完mysql的性能该如何优化你一定会有所收获。文件系统: 优化...
    99+
    2022-10-18
  • MySQL Limit性能优化及分页数据性能优化详解
    MySQL Limit可以分段查询数据库数据,主要应用在分页上。虽然现在写的网站数据都是千条级别,一些小的的优化起的作用不大,但是开发就要做到极致,追求完美性能。下面记录一些limit性能优化方法。 Lim...
    99+
    2022-10-18
  • MySQL中怎么优化批量SQL插入性能
    本篇文章为大家展示了MySQL中怎么优化批量SQL插入性能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、一条SQL语句插入多条数据常用的插入语句如:INSERT...
    99+
    2022-10-18
  • mysql优化之like和=性能详析
    引言 那使用过数据库的人大部分都知道,like和=号在功能上的相同点和不同点,那我在这里简单的总结下: 1,不同点:like可以用作模糊查询,而'='不支持此功能;如下面的例子,查询info表中字段id第一个字母为1...
    99+
    2022-05-12
    mysql like优化 mysql的like查询 mysql的性能优化
  • MySQL性能优化之一条SQL在MySQL中执行的过程详解
    目录一 MySQL的内部组件结构1.1 service层1.2 store层二 连接器三 分析器四 优化器五 执行器六 bin-log归档总结一 MySQL的内部组件结构 大体来说...
    99+
    2023-02-02
    mysql sql语句执行过程 简述SQL语句的执行顺序 数据库的sql执行过程
  • Oracle 的sql优化提高性能
    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引...
    99+
    2022-10-18
  • MySQL高性能SQL语句的编写和优化
    下文给大家带来有关MySQL高性能SQL语句的编写和优化内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL高性能SQL语句的编写和优化你一定会有所收获。环...
    99+
    2022-10-18
  • MySQL批量SQL插入的性能优化示例
    小编给大家分享一下MySQL批量SQL插入的性能优化示例,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作