MySQL优化六-优化慢查询

文章主要探讨了提升低效查询性能的策略,包括避免检索不必要的数据,如使用LIMIT优化查询,选择性地选取关联表的列,以及利用索引覆盖扫描。同时,建议减少重复查询和利用缓存提高效率。在MySQL层面,关注响应时间、扫描行数和返回行数,通过优化索引和查询结构来降低服务器负担。
摘要由CSDN通过智能技术生成

本文主要总结,如何提升性能低下的查询。慢查询的基本原因是,访问的数据太多,而很多情况下不需要筛选大量数据。对于低效的查询,可通过以下两个步骤分析:

目录

一、是否检索到大量超过需要的数据,意味着访问了太多的行;

 1、查询不需要的记录

 2、多表关联时返回全部列

 3、总是返回全部列

4、重复查询相同的数据

二、mysql服务器层是否在分析大量超过需要的数据行。


一、是否检索到大量超过需要的数据,意味着访问了太多的行;

 1、查询不需要的记录

使用select 语句查询大量的结果,只需前N行,然后关闭数据集。实际情况mysql查询全部的数据集,客户端接收到全部的数据集,然后抛弃大部数数据。最简单的做法是加上limit。eg:

mysql> select * from payment limit 10;

 2、多表关联时返回全部列

mysql> select * from actor 
    -> inner join film_actor where actor_id = actor_id

这将返回三个表的全部列,而且容易造成相同列名的冲突,正确的方式 是只最需要的列

mysql> select t1.* from actor t1
    -> inner join film_actor t2 where t1.actor_id = t2.actor_id

 3、总是返回全部列

取全部列,会让优化器无法完成覆盖索引这类的优化,还会给服务器带来IO,内存和CPU的损耗。

4、重复查询相同的数据

不断地重复执行相同的数据,然后返回完全相同的数据。比较好的方案是,当初次查询的时候,将数据缓存起来,比如使用redis缓存,需要的时候从redis缓存取出来,这样的性能会更好。

二、mysql服务器层是否在分析大量超过需要的数据行。

 衡量查询开销的三个指标有:

1、响应时间

2、扫描的行数

3、返回的行数

第2、3点的访问类型,从慢到快,分别是:全表扫描、索引扫描、范围扫描、唯一索引扫描和常数引用等。

一般mysql能够使用如下三种方式应用where条件,从好到坏如下:

1、在索引中使用where条件过滤不匹配的记录。

2、使用索引覆盖扫描来返回记录(在extra列中出现了using index),直接从索引中过滤不需要的记录,并返回命中的记录。

3、从数据表中返回数据,然后过滤不满足的条件(在extra出现using where)。

以下总结了分析手段,接下来总结下做法。如果发现扫描大量数据但只返回少量行。通过以下三个方法优化 :

1、使用索引覆盖 扫描,把所有的列放在索引中,这样存储引擎无须返回表获取对应行就返回结果。

2、改变表结构,例如使用单独的汇总表。

3、重写这个复杂的查询,让优化器能以更优化的方式查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个高效工作的家伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值