如果长度定义得太短,比如定义成了50字节,但实际企业名称有100字节,就会存储不下,而抛出异常 。
所以建议将企业名称改成varchar类型,变长字段存储空间小,可以节省存储空间,而且对于查询来说,在一个相对较小的字段内搜索效率显然要高些 。
我们在选择字段类型时,应该遵循这样的原则:
- 能用数字类型,就不用字符串,因为字符的处理往往比数字要慢 。
- 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等 。
- 长度固定的字符串字段,用char类型 。
- 长度可变的字符串字段,用varchar类型 。
- 金额字段用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个小技巧,太赞了](http://img.jiangsulong.com/220408/153QQ507-1.jpg)
文章插图
通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:
![聊聊sql优化的15个小技巧,太赞了](http://img.jiangsulong.com/220408/153QQ0H-2.jpg)
文章插图
如果你想进一步了解explain的详细用法,可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?》
说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了 。
下面说说索引失效的常见原因:
![聊聊sql优化的15个小技巧,太赞了](http://img.jiangsulong.com/220408/153QR348-3.jpg)
文章插图
如果不是上面的这些原因,则需要再进一步排查一下其他原因 。
此外,你有没有遇到过这样一种情况:明明是同一条sql,只有入参不同而已 。有的时候走的索引a,有的时候却走的索引b?
没错,有时候mysql会选错索引 。
必要时可以使用force index来强制查询sql走某个索引 。
至于为什么mysql会选错索引,后面有专门的文章介绍的,这里先留点悬念 。
推荐阅读
- 字节跳动 Service Mesh 数据面编译优化实践
- XAMPP 搭建PHP+MySQL环境 在macOS下,怎样本地安装WordPress ?
- 如何提高SQL查询的效率
- 如何彻底了解MySQL查询优化分析,看了这篇就够了
- 一文看懂docker部署PostgreSQL 11.5及数据持久化教程
- 十月百度烽火算法3.0更新对于网站优化有何意义?
- 恩施,茶产业链优化升级 促终端茶文化消费
- Python版本冲突?优化?Python开发环境的技巧来了
- 如何解决PHP study的MySQL的#1055的报错问题
- 什么是蜘蛛池?蜘蛛池对SEO有什么影响?