1。首先了解MySQL查询的执行过程。MySQL查询时,是由很多子任务组成的。每个子任务都会消耗一定的时间。如果要优化查询,实际上必须优化其子任务。您可以消除一些子任务,减少子任务的执行时间,并使子任务执行得更快。MySQL查询的执行过程:从客户端到服务端,然后在服务端解析,生成执行计划,执行,返回结果给客户端。执行是最重要的阶段,包括调用存储引擎检索数据、调用后的数据处理、排序、分组等;查询需要花时间在不同的地方,包括网络、CPU计算、生成统计、生成执行计划、锁等待等,尤其是从底层存储引擎获取数据的调用,这些调用需要花时间在内存操作、CPU操作,以及内存不足导致的IO操作。根据存储引擎的不同,还可能产生大量的上下文切换和系统调用。不必要的额外操作、不必要的重复操作、某些操作执行缓慢都是导致查询慢的原因。优化查询的目的是减少和消除花在这些操作上的时间。2、是否查询了不必要的数据有些查询会查询到很多不必要的数据。经查询,程序并没有使用。这不仅会给MySQL服务器带来额外的负担,还会增加网络开销,消耗应用程序。服务器的CPU和内存资源,简单来说就是吃多少就吃多少。不要有“把所有数据都查出来,用Java代码过滤”的想法。禁止使用select*查询。三、衡量查询开销的几个重要指标1、响应时间响应时间可以分为服务时间和排序时间。服务时间是指数据库处理查询所花费的实际时间;排队时间是指服务器因为等待某些资源而没有真正执行查询的时间,比如等待IO操作,等待行锁。2.扫描行数越短的行访问速度越快,访问内存中的行比访问磁盘中的行要快得多。理想情况下,扫描的行数和返回的行数相同。但这种情况很少见。例如,关联查询时,服务器必须扫描更多的行才能得到结果。因此,关联的表越多,性能越低。3、扫描的行数和访问类型MySQL可以通过多种方式查询和返回结果集。速度由慢到快,扫描的行数由多到少。顺序是全表扫描、索引扫描、范围扫描、唯一索引。扫一扫,不断参考。最常用的优化方法是为查询添加合适的索引。索引允许MySQL以最有效的方式以最少的扫描行数找到所需的记录。4、一般可以通过explain的Extra栏查看查询的优劣。一般MySQL可以通过以下三种方式来应用where条件,从好到坏依次是:在索引中使用where条件过滤不匹配的记录,这是在存储引擎层完成的;使用indexcoveragescan,即Extra中出现Usingindex,直接从索引中过滤不需要的记录,返回命中结果,在MySQLserver层完成,不需要回表查询记录;在ExtraUsing出现的地方,这是在MySQL服务器层完成的。MySQL需要先从数据表中读取记录,然后进行过滤。当Extra中出现Usingwhere时,可以通过以下方式进行优化:使用索引覆盖扫描,将所有需要的列都放在索引中,这样就不用回表查询了;更改表结构,例如使用汇总表;重写sql,让MySQL优化器以更优化的方式执行这条sql;
