SQL功能优化
Oracle 优化器RBO, CBO
RBO 根据规矩的优化器 oracle 10g开端,现已丢掉RBO
CBO 根据本钱的优化器 oracle 8中开端引进的 A8站源码交易平台
Oracle 解析器依照从右到左的次序处理FROM 字句中的表名,FROM 中写在最终的表(根底表, drving table)将先被处理,在FROM 子句中包括多个表的状况下,你有必要挑选记载条数最小的表作为根底表, 假如有3个以上的表衔接查,挑选穿插表(Insertection table)作为根底表,穿插表指的是被其他表锁引证的表
功能优化 A8站源码交易平台
SELECT句子必须指明字段称号
SELECT *添加许多不必要的耗费(cpu、io、内存、网络带宽);添加了运用掩盖索引的或许性;当表结构发作改动时,前断也需求更新。所以要求直接在select后边接上字段名。
SQL句子中IN包括的值不该过多
MySQL关于IN做了相应的优化,行将IN中的常量悉数存储在一个数组里边,并且这个数组是排好序的。可是假如数值较多,发作的耗费也是比较大的。再例如:select id from table_name where num in(1,2,3) 关于接连的数值,能用 between 就不要用 in 了;再或许运用衔接来替换。
尽量用union all替代union
union和union all的差异主要是前者需求将成果集兼并后再进行唯一性过滤操作,这就会涉及到排序,添加许多的CPU运算,加大资源耗费及推迟。当然,union all的前提条件是两个成果集没有重复数据。
区别in和exists, not in和not exists
select * from 表A
where id in (select id from 表B)
等价于
select * from 表A
where exists(select * from 表B where 表B.id=表A.id)
区别in和exists主要是造成了驱动次序的改动(这是功能改变的要害),假如是exists,那么以外层表为驱动表,先被拜访,假如是IN,那么先履行子查询。所以IN适合于表面大而内表小的状况;EXISTS适合于表面小而内表大的状况。
关于not in和not exists,引荐运用not exists,不仅仅是功率问题,not in或许存在逻辑问题。怎么高效的写出一个替代not exists的sql句子?
比如 A8站源码交易平台
select colname … from A表
where a.id not in (select b.id from B表)
优化
select colname … from A表 Left join B表 on
where a.id = b.id where b.id is null
不主张运用%前缀含糊查询
例如LIKE “%name”或许LIKE “%name%”,这种查询会导致索引失效而进行全表扫描。可是能够运用LIKE “name%”。
那怎么查询%name%?
如下图所示,尽管给secret字段添加了索引,但在explain成果果并没有运用
防止隐式类型转化A8站源码交易平台
where 子句中呈现 column 字段的类型和传入的参数类型不一致的时分发作的类型转化,主张先确认where中的参数类型
关于联合索引来说,要恪守最左前缀规律
举列来说索引含有字段id,name,school,能够直接用id字段,也能够id,name这样的次序,可是name;school都无法运用这个索引。所以在创立联合索引的时分必定要注意索引字段次序,常用的查询字段放在最前面
A8站源码交易平台
总结以上优化主张
防止对索引字段进行核算操作
防止在索引字段上运用 not <> !=
防止在索引字段上运用 is null , is not null
防止在索引字段上呈现数据类型转化
防止在索引字段上运用函数
防止树立索引的列中运用空值
Union Union ALL
union 会将各查询的子集的记载做比较,会比UNION ALL 功能差许多,
对与WHERE的句子规律
尽量防止在WHERE子句中运用in, not in 或许 having ,能够运用exist ,not exist 替代 in ,not in
不要以字符格局声明数字, 不要以数字格局声明字符值,不然会使索引无效
A8站源码交易平台