《高性能MySQL》之MySQL查询性能优化
为什么查询会慢?响应时间过长。如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快。 客户端->服务器->服务器上解析->生成执行计划->执行->返回结果给客户端。 其中”执行”包括大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。 慢查询:优化数据访问查询性能低下最基本的原因:访问的数据太多。 低效查询分析: 1.确认应用程序是否在检索大量超过需要的数据; 2.确认MySQL服务器层是否在分析大量超过需要的数据行; 是否向数据库请求了不需要的数据典型案例(主要体现为了省事,使用SELECT *):
MySQL是否在扫描额外的记录在确定查询只返回需要的数据以后,接下来看查询为了返回结果是否扫描过多的数据。对于MySQL,最简单的衡量查询开销的三个指标: 响应时间响应时间包含服务时间和排队时间。 服务时间是指数据库处理这个查询真正花了多长时间。 排队时间是指服务器因为等待某些资源而没有真正执行查询的时间,可能等I/O操作完成,也可能等待行锁。 扫描的行数和返回的列数在一定程度上能够说明该查询找出需要的数据的效率高不高。 扫描的行数和访问类型访问类型主要指全表扫描、索引扫描、范围扫描、唯一索引查询、常数引用。 一般MySQL能够使用如下三种方式应用WHERE条件,从好到坏依次为:
如果发现查询需要扫描大量的数据但只返回少数的行,那么通常可以尝试下面的技巧去优化它:
重构查询的方式复杂查询拆分多个简单查询切分查询将大查询拆分为小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分查询结果。 分解关联查询用分解关联查询的方式重构查询有如下优势:
2.服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。 3.服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。 4.MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。 5.将结果返回给客户端。 优化特定类型的查询优化COUNT()查询优化关联查询
优化子查询对于子查询的优化,尽可能使用关联查询代替。 优化GROUP BY 和 ORDER BY最有效的优化办法是使用索引。 当无法使用索引时,可以使用临时表或者文件排序来做分组。 另外如果需要对关联查询做分组,并且是按照查找表中的某个列进行分组,那么通常采用查找表的标识列分组的效率会比其他列更高。 优化LIMIT 分页在系统中需要进行分页操作的时候,我们通常会使用LIMIT 加上偏移量的办法实现,同时加上合适的ORDER BY子句。如果有对应的索引,通常效率会不错,否则,MySQL需要做大量的文件排序操作。 优化UNION查询静态查询分析使用用户自定义变量那些场景不能使用用户自定义变量:
用户自定义变量的用法:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |