SQL的优化

在日常开发中要有使用explain的习惯,用explain分析一下你写的SQL,是不是走不走索引。

下面分享学习的sql优化建议

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

    这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL 会做隐式的类型转换,把它们转换为浮点数再做比较。

  • 为了提高 group by 语句的效率,可以在执行到该语句前,把不需要的记录过滤掉。
  • 索引不适合建在有大量重复数据的字段上,如性别这类型数据库字段
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型
  • 一个表的索引数最好不要超过 5 个,若太多需要考虑一些索引是否没有存在的必要。
  • where 子句中考虑使用默认值代替 null 字段尽量不要设置默认null
  • 避免同时修改或删除过多数据,因为会造成 CPU 利用率过高,从而影响别人对数据库的访问。( 一次性删除太多数据,可能会有 lock wait timeout exceed 的错误,所以建议分批操作。)
  • 删除冗余和重复索引
  • 在适当的时候,使用覆盖索引覆盖索引能够使得你的 SQL 语句不需要回表,仅仅访问索引就能够得到所有需要的数据,大大提高了查询效率。
  • 使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  • Inner join 、left join、right join,优先使用 Inner join,如果是 left join,左边表结果尽量小。Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集。left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。都满足 SQL 需求的前提下,推荐优先使用 Inner join(内连接),如果要使用 left join,左边表数据结果尽量小,如果有条件的尽量放到左边处理。(尽量少用join对于以后的数据库优化分表都有一定的缺陷)
  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
  • 尽量避免在索引列上使用 MySQL 的内置函数
  • 优化你的 like 语句把%放前面,不走索引把%放关键字后面,还是会走索引。
  • 应尽量避免在 where 子句中使用 or 来连接条件
  • 如果知道查询结果只有一条或者只要最大/最小一条记录,要加上 limit 1
鲁ICP备16017569号-2