MySQL 慢查询基础:优化数据访问

  对于低效的查询,我们发现通过以下两个步骤分析很有效:

    (1)确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候也可能是访问了太多的行

    (2)确认MySQL服务器层是否在分析大量超过需要的数据行

  优化查询的方法如下:

  (1)是否向数据库请求了不需要的数据

    对于查询数据是,可能应用程序会查询了太多不需要的数据,这会造成两方面的缺点

      ①会给MySQL服务器带来额外的负担,并增加网络开销

      ②另外也会消耗应用服务器的CPU

    这里有一些典型的案例:

      ①查询不需要的记录:MySQL在查询时,实际上会先返回全部的结果集然后再进行计算,并不是只返回需要的数据。这也就是说如果你先select大量的数据然后再截取前几条记录的话,那么就意味着会浪费性能。因为MySQL实际上是先查询出全部的结果集再抛弃大部分数据给你,并不是返回你要的那几条数据。最简单有效的就是加一个limit进行限制

      ②多表关联时返回全部列:

    

      对于以上写法应改成

     

      ③总是取出所有列:尽量不要使用select *的写法。因为这会导致优化器无法完成索引覆盖这类优化,还会为服务器带来额外的I/O,内存和CPU的消耗。当然查询返回超过需要的数据并不总是坏事,比如当应用程序使用了某种缓存机制,或者有其他考虑,获取超过需要的数据叶可能是有其好处,打不要忘记这样做的代价。获取并缓存所有的列的查询,相比多个独立的只获取部分列的查询可能就更有好处

      ④重复查询相同的数据:不断的重复执行相同的查询,然后每次都返回完全相同的数据。比如:用户评论是不断抓取用户头像的url,这时候就可以通过缓存机制,从缓存中取出,不需要重复查询。

  (2)MySQL是否在扫描额外的记录

    对于MySQL最简单的衡量查询开销的三个指标:①响应时间  ②扫描的行数  ③返回的行数。没有那个指标能够完美的衡量查询的开销,但他们可以大致的反应MySQL在内部执行查询时需要访问多少数据,并可以大概推算出查询运行的世界。这三个指标会被记录在MySQL的慢查询中,所以查询慢日志记录是找出扫描行数过多的查询的好办法

    ①响应时间:响应时间由两个部分组成:服务时间和排队时间。服务时间是指数据库处理这个查询真正花了多长时间。排队时间是指服务器因为等待某些资源(比如锁竞争,等待I/O等)而没有真正执行查询的世界。

    然而在不同类型的应用压力下,响应时间并没有一致的规律或者公式。诸如存储引擎的锁、高并发资源竞争、硬件响应等诸多因素都会影响响应时间。所以响应时间既可能是一个问题的结果也可能是一个问题的原因,不同案例情况不同。

    所以当你看到一个响应时间的时候,首先要问问自己这个响应时间是不是一个合理的值

    ②扫描的行数和返回的行数:扫描的行数对于我们分析查询时非常有帮助了,这在一定程度上能够说明该查询找出需要的数据的效率高不高。对于找出那些糟糕的查询,这个指标可能还不够完美,因为并不是所有的行的访问代价都是相同的。较短的行的访问速度更快,内存中的行也比磁盘中的行的访问速度要快得多

    理想情况下扫描的行数=返回到行数。但是现实很残酷,一般没有这种操作。

    ③扫描的行数和访问类型:在评估查询开销的时候,需要考虑一下从表中找到某一行数据的成本。MySQL有好几种访问方式可以查找并返回一行结果。有些访问方式可能需要扫描很多行才能返回一行,也有些访问方式可能无需扫描就能返回结果。

    在EXPLAIN语句中的type列反映了访问类型。访问类型有很多种,从权标扫描到索引扫描、范围扫描、唯一索引查询、常数引用等。这里列的这些,速度从慢到快,扫描的行数从小到大。

    如果查询没有办法找到合适的访问类型,那么解决的最好办法通常就是增加一个合适的索引(索引让MySQL以最高效、扫描函数最少的方式找到需要的记录)

    如果发现查询需要扫描大量的数据但是只返回少数的行,那么通常可以使用下面的技巧进行优化

      ①使用索引覆盖扫描,把索引需要用的列都放到索引当中,这样存储引擎无需回表获取对应行就可以返回结果  ②该表库表结果。例如使用单独的汇总表  ③重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询。

原文地址:https://www.cnblogs.com/tijie/p/10673206.html

时间: 2024-08-24 19:07:33

MySQL 慢查询基础:优化数据访问的相关文章

MySQL之查询性能优化一

只有当查询优化,索引优化,库表结构优化齐头并进时,才能实现mysql高性能. 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间. 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后再服务器上进行解析,生成执行计划,执行,并返回结果给客户端. 其中"执行"可以认为是整个生命周期最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序,分组等. 对于一个查询的全部生命周期,上面列的并不完整.这里我们只是想说:了解查询的生命周期,

MySQL之查询性能优化

为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中"执行"可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序.分组等. 在完成这些任务的时候,查询需要在不同的地方花费时间,包括网络,CPU计算,生成统计信息和执行计划.锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作.CPU操作和内存

09 优化数据访问

本章提要--------------------------------------数据库引擎如何访问数据定位表中数据:1) 扫描全表2) 基于荣誉访问结构(比如 索引)进行查找, 或基于表本身的结构(比如, 哈希聚簇)进行查找--------------------------------------9.1 照出不理想的访问路径    一般的, 一个访问路径所使用的资源和返回的行的总数成比例的话是可以接受的, 也就是说, 返回的行少, 消耗的资源就少, 返回的行多,    消耗的资源就多, 并

MySQL学习——查询表里的数据

MySQL学习——查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 1 select [distinct] 列1 [as '别名1'], ..., 列n [as '别名n'] from 表名 2 [where 表达式] 3 [group by 表达式] 4 [having 表达式] 5 [order by 表达式] 6 [limit 起始编号, 查询条数] 说明 1 列1, ..., 列n:表示查询的字段,查询多个字段用“,”分隔,使用“*”号表示查询全部字

MySQL子查询的优化

一.MySQL子查询的位置 当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句).子查询也是使用频率比较高的一种查询类型.因此,优化子查询,对于整个系统的性能也有直接的影响. 从查询出现在SQL语句的位置来看,它可以出现在目标列中,也可以出现在from子句中,还可以出现在JOIN/ON子句.GROUPBY子句.HAVING子句.ORDERBY子句等位置.下面依次来看这几种形式的子查询,以及对他们进行优化的一些想法. 1.子查询出现在目标列位置 当子查询出现在目标列位置的时

MySQL之查询性能优化四

MySQL的万能"嵌套循环"并不是对每种查询都是最优的.不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作.在这我们先来看看mysql优化器有哪些局限性: 1.关联子查询 mysql的子查询实现得非常糟糕.最糟糕得一类查询是where条件中包含in()的子查询语句. 例如,我们希望找到sakila数据库中,演员Penlope Guiness参演的所有影片信息. 很自然的,我们会按照下面的方式用子查询实现: select * fro

mysql将查询到的数据导出为excel

现在需要将mysql库中的一些数据导出为excel,然后打印.其实实现上面说的需求很简单,只要你把sql语句写出来,然后导出为excel即可 具体实现流程如下: 1.写出sql语句,查询出结果. 2.在查询的结果上点击右键,选择"导出所有表数据记录/结果为..." 如图所示: 选择"导出所有表数据记录/结果为..."之后出现如下图所示 点击导出即可. ======================================================== 需

mysql 根据查询条件删除数据 mark一下

DELETEFROMdd_itemWHEREdd_item.id IN ( SELECT * from( SELECT a.id FROM dd_item a LEFT JOIN dd_item_cat b ON a.class_id = b.id WHERE b.parent_id=23 and (b.name in ('生蚝','带鱼','黄鳝')) ) as ee ) //mysql 根据查询子条件进行删除表的记录 原文地址:https://blog.51cto.com/13288309/

【MySQL】查询语句优化 𠔻

原文: http://blog.gqylpy.com/gqy/389 ???????MySQL的性能优化包罗甚广:索引优化.查询优化.查询缓存.服务器设置优化.操作系统及硬件优化.应用层优化(web服务器.缓存)等等.本文提到的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录. 整理如下 合理创建索引 count 的优化 避免使用不兼容的数据类型 索引字段上进行运算会使索引失效 尽量避免使用 !=.is null.is not nu