那么今天我们就来科普一些SQL优化的小技巧 , 熟练掌握这些技巧之后 , 在日常工作中 , 程序就会比原来跑得轻松许多哦 。
1、如果你知道想要查询的数据只有一条结果的话 , 在SQL后面加上limit 1
如果在业务系统中 , 已经决定了数据只有一条 , 比如说 , 我们要查找身份证号为XXX的某个人 , 我们知道是只有一个人的 , 但是数据库并不知道 , 所以显式的告诉数据库 , 找到了 , 别在往下找了 , 让它主动停止游标的移动 。
2、尽管避免使用Select * , 如果需要查询所有字段 , 将字段名显式的写在SQL里
很多时候 , 我们为了方便 , 喜欢写Select * , 但是在MySQL里 , 使用*后会不使用索引 , 触发全表扫描 , 导致效率降低 。
3、在业务层进行计算 , 避免使用数据库层进行计算
很多时候 , 我们喜欢采用SQL自带的函数进行计算 , 比如说在SQL里用函数直接获取当前时间 。 这种最好在业务层计算出当前时间 , 然后把当前时间作为参数传入SQL 。 这样可以节省数据库CPU , 而且在多次传入的SQL相同的情况下 , 还可以利用查询缓存 。
4、能用union all的场景尽量不用union
sql语句使用union关键字后 , 可以获取排重后的全并数据 。 而如果使用union all关键字 , 可以获取所有数据 , 包含重复的数据 。 排重的过程需要遍历、排序和比较 , 它更耗时 , 更消耗cpu资源 。 所以如果能用union all的时候 , 例如说在业务层已经知道两个表的数据不会有重合 , 或者说重复的数据对业务层来说不影响 , 那么就尽量不用union 。
5、利用小表驱动大表 , 而不是反过来
业务应用中 , 我们经常会用到查询一个表中的数据在另一个表中出现过的情况 , 例如有order和user两张表 , 其中order表有10000条数据 , 而user表有100条数据 。 如果想查一下 , 所有有效的用户下过的订单列表 。 可以使用in关键字实现:
select * from order where user_id in (select id from user where status=1)
在这种情况下 , 写在子查询里的语句尽量采用小表 , 因为SQL会优先执行in里面的子查询 , 如果in里面的数据量少 , 作为条件查询 , 速度会更快 。
6、使用批量插入 , 而不是一条条插入
在很多情况下 , 我们需要循环一些内容 , 然后将数据插入到数据库中 , 那么 , 如果我们在循环过程中一条条插入 , 效率会么低 , 这种情况下 , 我们需要使用批量插入 , 类似于:
insert into order(idcodeuser_id) values(112'001'100)(125'002'100)(425'003'101);
7、如果业务涉及的大部分是单条查询 , 用Hash索引 , 而不是B-Tree索引
因为Hash索引的查询时间复杂度是O(1) , 而B-Tree是O(log(n)) , 所以如果业务涉及的大部分是单条数据的查询的话 , 用哈希索引效率会更高 。
8、尽量使用varchar类型而不是char类型
char表示固定字符串类型 , 该类型的字段存储空间的固定的 , 会浪费存储空间 。 varchar表示变长字符串类型 , 该类型的字段存储空间会根据实际数据的长度调整 , 不会浪费存储空间 。 因此 , 在非固定长度字符串的列 , 尽量使用varchar 。
9、选择数据库字段类型的一些规则
【数据库|特别有用的SQL优化小技巧,了解之后程序性能大为提升】遵循一些规则 , 会使我们的数据库表运行更加高效 , 一些通用的规则包括:
u 能用数字类型 , 就不用字符串 , 因为字符的处理往往比数字要慢 。
u 尽可能使用小的类型 , 比如:用bit存布尔值 , 用tinyint存枚举值等 。
u 长度固定的字符串字段 , 用char类型 。
u 长度可变的字符串字段 , 用varchar类型 。
u 金额字段用decimal , 避免精度丢失的问题 。
10、先缩小数据范围 , 再进行group by
很多情况下 , 我们的业务场景需要使用group by关键字 , 用于去重和分组 。 通常它会跟having一起配合使用 , 表示分组后再根据一定的条件过滤数据 。 但是分组是一个相对耗时的操作 , 因此 , 我们可以先缩小数据的范围 , 然后再分组 , 以优化SQL的性能 。 类似于
- Win10|为什么安卓手机内部设计较乱,没有苹果的精致,工整?
- iqoo|叫停京东方生产后,传苹果考虑取消百亿订单,央视早有劝诫
- |你了解过变频器的矢量型和通用型两种类型的产品在技术上有哪些区别?
- 荣耀|骁龙8gen1依旧表现一般,骁龙8+能救场吗?首发又有戏看!
- 高通骁龙|高通提前发布骁龙8Plus,手机厂商迎来新“卷”程,等等党有福了
- CPU|联发科天玑处理器能效比有多强?不输苹果,全面领先高通
- 红米手机|马斯克和贝索斯 世界上最富有的两个人联手对抗一个共同的对手
- 交易|超3亿用户背后,闲鱼灰色交易曝光!只有想不到的,没有不敢卖的
- 华硕|华硕a豆开启新品预热,暗示将搭载H45标压芯片,还有航天定制版
- 显卡|2022上半年换新机,有哪些很值得关注的旗舰?