聊聊sql优化的15个小技巧,太赞了( 四 )


如果长度定义得太短,比如定义成了50字节,但实际企业名称有100字节,就会存储不下,而抛出异常 。
所以建议将企业名称改成varchar类型,变长字段存储空间小,可以节省存储空间,而且对于查询来说,在一个相对较小的字段内搜索效率显然要高些 。
我们在选择字段类型时,应该遵循这样的原则:

  1. 能用数字类型,就不用字符串,因为字符的处理往往比数字要慢 。
  2. 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等 。
  3. 长度固定的字符串字段,用char类型 。
  4. 长度可变的字符串字段,用varchar类型 。
  5. 金额字段用decimal,避免精度丢失问题 。
还有很多原则,这里就不一一列举了 。
14 提升group by的效率我们有很多业务场景需要使用group by关键字,它主要的功能是去重和分组 。
通常它会跟having一起配合使用,表示分组后再根据一定的条件过滤数据 。
反例:
select user_id,user_name from ordergroup by user_idhaving user_id <= 200;这种写法性能不好,它先把所有的订单根据用户id分组之后,再去过滤用户id大于等于200的用户 。
分组是一个相对耗时的操作,为什么我们不先缩小数据的范围之后,再分组呢?
正例:
select user_id,user_name from orderwhere user_id <= 200group by user_id使用where条件在分组前,就把多余的数据过滤掉了,这样分组时效率就会更高一些 。
其实这是一种思路,不仅限于group by的优化 。我们的sql语句在做一些耗时的操作之前,应尽可能缩小数据范围,这样能提升sql整体的性能 。
15 索引优化sql优化当中,有一个非常重要的内容就是:索引优化 。
很多时候sql语句,走了索引,和没有走索引,执行效率差别很大 。所以索引优化被作为sql优化的首选 。
索引优化的第一步是:检查sql语句有没有走索引 。
那么,如何查看sql走了索引没?
可以使用explain命令,查看mysql的执行计划 。
例如:
explain select * from `order` where code='002';结果:
聊聊sql优化的15个小技巧,太赞了

文章插图
 
通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:
聊聊sql优化的15个小技巧,太赞了

文章插图
 
如果你想进一步了解explain的详细用法,可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?》
说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了 。
下面说说索引失效的常见原因:
聊聊sql优化的15个小技巧,太赞了

文章插图
 
如果不是上面的这些原因,则需要再进一步排查一下其他原因 。
此外,你有没有遇到过这样一种情况:明明是同一条sql,只有入参不同而已 。有的时候走的索引a,有的时候却走的索引b?
没错,有时候mysql会选错索引 。
必要时可以使用force index来强制查询sql走某个索引 。
至于为什么mysql会选错索引,后面有专门的文章介绍的,这里先留点悬念 。
 




推荐阅读