慢查询基础

  • 是否在检索大量不需要的行或列

  • 是否在MySQL分析大量的数据行

  • 覆盖索引

  • 优化表结构

  • 重构查询

重构查询的方式

复杂查询还是简单查询

对于现代MySQL数据库来讲,网络通信、查询解析和优化已经不是影响查询效率的因素,反而MySQL内部扫码数据所消耗的时间远大于数据返回客户端的时间。所以需要考虑是否可以将复杂查询进行拆解。

切分查询

比如分表、分区间等等。

分解关联查询

优势:

  • 提升缓存效率。细化缓存粒度,提升缓存使用率。
  • 减少锁竞争,提高并发量。
  • 提升查询本身的效率,比如IN子句转换为索引已知范围查询。
  • 减少冗余查询,提供查询结果利用率。

查询执行基础

查询执行路径查询执行路径

MySQL查询优化器的局限性

关联子查询

IN 子查询。 全表扫描外表(表索引或者是表数据)再通过 内外表关联关系逐个查询内表。

union 的限制

优化特定类型的查询

count

count(*) 扫描数据忽略是否为null,而具体的字段则会忽略null值。