前言

接下来是查询优化,用户80%的操作基本都在查询,我们有什么理由不去优化他呢??所以我们将会讲解大量的查询优化(索引以及库表结构优化等高级用法后面再讲),先讲单表查优化,再讲多表查优化。

明确搜索优化的整体思路以及查询优化的因素

搜索优化的整体思路

索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等。对于一个整体项目而言只有这些齐头并进,才能实现mysql高性能。

查询优化的因素思路

是否向数据库请求了不需要的数据。

也就是说不要轻易使用select * from ,能明确多少数据就查多少个

mysql是否扫描额外的纪录

查询是否扫描了过多的数据。
最简单的衡量查询开销三个指标如下:

  • 响应时间;
  • 扫描的行数;
  • 返回的行数。

没有哪个指标能够完美地衡量查询的开销,但它们大致反映了mysql在内部执行查询时需要多少数据,并可以推算出查询运行的时间。

这三个指标都会记录到mysql的慢日志中,所以检查慢日志记录是找出扫描行数过多的查询的好办法。

响应时间是两个部分之和:服务时间和排队时间。
服务时间是指数据库处理这个查询真正花了多长时间。
排队时间是指服务器因为等待某些资源而没有真正执行查询的时间。
—可能是等io操作完成,也可能是等待行锁,等等。

扫描的行数和返回的行数:分析查询时,查看该查询扫描的行数是非常有帮助的。这在一定程度上能够说明该查询找到需要的数据的效率高不高。

扫描的行数和访问类型: 在expain语句中的type列反应了访问类型。
访问类型有很多种,从全表扫描(ALL)到索引扫描(index)到范围扫描(INDEX RANGE SCAN)到唯一索引查询到常数引用等。这里列的这些,速度由慢到快,扫描的行数也是从小到大。
如果发现查询需要扫描大量的数据但只返回少数的行,那么通常可以尝试下面的技巧去优化它:

  1. 使用索引覆盖扫描。
  2. 改变库表结构。例如使用单独的汇总表。
  3. 重写这个复杂的查询。让mysql优化器能够以更优化的方式执行这个查询。
查询方式
  1. 一个复杂查询 or 多个简单查询
    设计查询的时候一个需要考虑的重要问题是,是否需要将一个复杂的查询分成多个简单的查询。

  2. 切分查询
    有时候对于一个大查询我们需要“分而治之”,将大查询切分为小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分查询结果。

  3. 分解关联查询

    select * from tag