sql语句优化
工作转眼一年多了,回头看看以前写的代码觉得有必要整合一下sql,提高些许性能,下面是总结的一些经验,经供参考
1.in ,or 比较
sql 1:SELECT * from file where file_type ="DCM" or file_type ="JSON"
Result: Time: 0.007s
sql 2:SELECT * from file where file_type in ("DCM" ,"JSON")
Result:Time: 0.010s
结论:差别不大
2.left join ,right join 比较
sql 1: select * from instance left join series on series.pk=instance.series_pk
Result :Time: 0.024s
sql 2:select * from series RIGHT JOIN instance on series.pk=instance.series_pk
Result : Time: 0.016s
sql 3:select * from series left join instance on series.pk=instance.series_pk
Result : Time: 0.014s
sql 4:select * from instance RIGHT JOIN series on series.pk=instance.series_pk
结论: left join 小表在前,大表在后, right join 大表在前,小表在后。
3.exists ,in 比较
sql 1 :select * from instance where series_pk in(select pk FROM series where modality="CT")
Result :Time: 0.009s
sql 2 :select * from instance where EXISTS(select pk FROM series where series_pk=series.pk and modality="CT")
Result : Time: 0.017s
结论:与网上Exists 效率比 in 高 不符合,实际情况,在环境下选择。
4.新建索引的条件
4.1 表的字段唯一约束
4.2 查询中与其它表关联的字段
4.3 查询中排序的字段
4.4 查询中统计或分组统计的字段
5.不应该新建索引的情况
5.1 表记录太少
5.2经常插入、删除、修改的表
5.3 数据重复且分布平均的表字段
5 .创建索引时需要注意的问题
5.1 最常用作限制条件的列放在最左边,依次递减。
5.2 索引不会包含有NULL值的列
5.3 适用短索引
5.4 排序的索引问题 --数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
5.5 like语句操作
5.6 不要在列上进行运算
5.7 不使用NOT IN和操作
6.sql 注意事项
5.1 union并不绝对比or的执行效率高
select * FROM series where modality ="CT" or modality="MR"
Result:Time: 0.001s
sql 2:select * from series where modality ="DCM" UNION select * from series where modality ="MR"
Result:Time: 0.003s
sql 3:select * FROM series where modality ="CT" or study_pk=62
Result:Time: 0.001s
sql 4: select * from series where modality ="DCM" UNION select * from series where study_pk=62
Result:Time: 0.001s
解决方法:同一字段用 or ,不同字段用 union
如果有网友有更好的解决或提高sql效率意见或者建议,请用邮箱联系.www.codemanzz@163.com