当前位置: 首页 > 科技观察

编写高质量SQL的建议

时间:2023-03-20 12:02:13 科技观察

1。避免混淆的逻辑反例:(统计用户数)Listusers=userMapper.selectAll();returnusers.size();正例:intcount=userMapper.countUser("selectcount(*)fromuser");returncount;2.selectone如果只有一个已知结果,则使用limit1反例:(搜索昵称=宝芝琼瑶的用户)selectid,nicknamefromtwherenickname='举报琼瑶'正例:selectid,nicknamefromtwherenickname='举报琼瑶'limit1原因:添加limit1,只要找到对应的一条记录,就不会继续向下扫描,效率会大大提高。limit1适用于查询结果为1(或0)的SQL语句,会引起全表扫描。如果条件列上有索引,不要使用limit1,比如主键查询id=13,尽量避免在where子句中使用or连接条件反例:(搜索name=张三的用户oroutlawlunatic)selectid,namefromtwherename='张三'orname='法外狂人'正例:selectid,namefromtwherename='张三'unionallselectid,namefromtwherename='法外狂人'原因:使用or会导致引擎放弃使用索引并进行全表扫描4.优化like关键字like在模糊查询中经常使用。编码不当会导致索引失败。反例:selectuserId,namefromuserwhereuserIdlike'%123'正例:selectuserId,namefromuserwhereuserIdlike'123%'%123,索引前的百分号123%,百分号后面是索引,但也有百分号后面的情况后面没有索引。mysql的innodb存储引擎最终执行哪个方法是根据成本计算的。通过全表扫描和二级索引对比可以使用INFORMATION_SCHEMA.OPTIMIZER_TRACE分析查询过程,然后复制trace字段json进行分析。5、查询SQL尽量不要使用select*,而是选择特定的字段,不要返回没有用到的字段。反例:(统计用户数)select*fromt正例:selectid,name,telfromt原因:阻止优化器选择更好的执行计划。例如,在索引扫描中添加或删除字段可能会导致代码崩溃。6.尽量避免在索引列上使用mysql内置函数的反例:select*fromuserwheredate_add(create_time,Interval5day)>=now()正例:select*fromuserwherecreate_time>=date_add(now(),interval-5day)不使用索引,取索引7、尽量避免使用where子句对字段中的字段进行表达式操作,这会导致系统放弃使用索引,进行全表扫描。例子:(操作user_age字段,不使用索引)select*fromuserwhereuser_age-1=2正例:(使用索引)select*fromuserwhereuser_age=3