MySQL优化六-优化慢查询

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

目录

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

 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、重写这个复杂的查询,让优化器能以更优化的方式查询。

你可能感兴趣的:(mariadb,mysql,数据库)