SQL优化
---恢复内容开始---
解析
在空享池中查找相同的SQL语句 (缓冲中查找)
语法分析 (语法是否准确)
语义分析 (列名,表名是否准确)
对象加锁 (防止其他对象进行操作)
权限检查
确定执行计划
保存执行计划 (保存到高速缓冲中)
执行
提取
① select 中避免写*
② 编写SQL时使用相同的编码风格 这样容易到缓冲中查找到
③ 使用where字句代替having字句
select t.projectid,AVG(t.dynamiccost) from cm_costsummary t group by projectid having projectid >4344 0.218 优化为 select t.projectid,AVG(t.dynamiccost) from cm_costsummary t where projectid>4344 group by projectid 0.203
④ 删除全部数据 使用 truncate代替delete
⑤ 确保完整的情况下多commitの3
⑥ 使用Exists替代in exists 主查询小 而子查询大
select * from cm_standardlimitchild c where c.standardlimitid in (select t.standardlimitid from cm_standardlimit t where cityid=-1 ) 0.094
优化为
select * from cm_standardlimitchild c where exists(
select 1 from cm_standardlimit
where standardlimitid=c.standardlimitid and cityid=-1
)
0.093
⑦用exists替代distinct distinct需要进行排序来确定哪些行重复 而exists不需要
⑧使用表连接而不是多个子查询 (当查询语句中包含子查询或者子查询的嵌套时,会因为执行了多个查询操作而导致系统效率低下)
⑨使用'<='代替<
=>100 >99 查询时=>100 会先定位到100 而>99会定位到99 所以>会好一点
⑩尽量使用表的别名并在列前标注来源于哪个表 (显著提高SQL语句的执行效率)
select CITYID, STATEPROVID, CITYCODE, NAME, FULLNAME, ISDEFAULT, DISPLAYORDER, RECORDSTATUS,
CREATEUSERID, CREATEDATE, MODIFYUSERID, MODIFYDATE from cf_city 0.125
优化为
select t.CITYID, t.STATEPROVID, t.CITYCODE, t.NAME, t.FULLNAME, t.ISDEFAULT, t.DISPLAYORDER, t.RECORDSTATUS,
t.CREATEUSERID, t.CREATEDATE, t.MODIFYUSERID, t.MODIFYDATE from cf_city t 0.094
表的连接方法
①From 字句中将数据量最小的表作为驱动表
一般情况下,将From字句中的最后指定的表,即出现在From字句最右边的表作为驱动表, 然后系统对驱动表进行排序,然后从右到左,依次处理其余的表
所以建议选择行数最小的表作为驱动表,来提高SQL的执行效率
②Where字句的连接顺序
当where字句中有多个查询条件时,顺序为由右到左,即由下到上的顺序,最好将能过滤到表中记录最多的条件写到Where字句的最后
有效使用索引
对经常以查询关键字为基础的表建立索引
索引应建立在where字句经常引用的列上
为了提高多表连接的性能,应该在连接列上建立索引

浙公网安备 33010602011771号