查询计划

MySQL 查询计划

1
EXPLAIN SELECT COUNT(*) FROM person

基本

  1. IN 包含的值不应过多

  2. SELECT 语句返回字段务必指明字段名称

  3. 当只需要一条数据的时候,使用 limit 1

  4. 如果排序字段没有用到索引,就尽量少排序。或者为排序字段创建索引

    or 两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用 union all 或者是 union (必要的时候) 的方式来代替 “or” 会得到更好的效果

  5. 尽量用 union all 代替 union

  6. 区分 in 和 exists、not in 和 not exists

    IN 适合于外表大而内表小的情况;EXISTS 适合于外表小而内表大的情况

  7. 使用合理的分页方式以提高分页的效率

    假设主键 ID 自增,且根据 ID 正排序。可以取上一个页最后一条的 ID 值 where id> 866612 limit 20

  8. 左右模糊查询应考虑使用全文索引,MySQL 支持

索引

  1. 避免在 where 子句中对字段进行 null 值判断,索引会失效

  2. 索引不会包含有 NULL 值的列

    只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL 值,那么这一列对于此复合索引就是无效的,我们在数据库设计时不要让字段「可能会作为查询的字段」的默认值为 NULL

  3. 给排序字段创建索引,如果有多个排序字段,则创建复合索引。注意:排序方向必须一致,即都为正序或倒序

  4. 查询条件包含 or,可能导致索引失效

  5. 如果字段类型是字符串,where 时一定用引号括起来,否则索引失效

  6. like 查询以 % 开头,会导致索引失效

  7. 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效

  8. 在索引列上使用 mysql 的内置函数,索引失效

  9. 对索引列运算(如,+、-、*、/),索引失效

  10. 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效

  11. 不要给 ‘ 性别 ‘ 等增加索引。如果某个数据列里包含了均是 “0/1” 或 “Y/N” 等值,即包含着许多重复的值,就算为它建立了索引,索引效果不会太好,还可能导致全表扫描

创建索引

  1. where 条件
  2. order by 排序字段
  3. group by 分组字段
  4. left join xxx on 关联字段

索引字段数据差异越大,索引效果越好,比如唯一字段