- 当单个查询检索的行数不大于表总行数的10%时,建立索引是有效的
- UNION ALL用于获得两个查询检索到的所有行,包括重复行;UNION用于获得查询检索到的所有不重复的行。因为 UNION删除了重复行,所以尽量使用UNION ALL
- 避免隐式转换 错误示例:select * from df_formbill where id = '2';
- 尽量使用exists 代替 IN。IN用于检查一个值是否包含在列表中,EXISTS与IN不同:EXISTS只检查子查询返回的行的存在性,而IN检查实际的值
-- IN示例 select * from dept where deptno NOT IN ( select deptno from emp ); -- Exists示例 select * from dept where not exists ( select deptno from emp where emp.deptno=dept.deptno);
- 尽量使用Exists代替Distinct。DISTINCT用于禁止重复行的显示,DISTINCT在禁止重复行之前要排序检索到的所有行;EXISTS用于检查子查询返回的行的存在性,只要找到有一个存在就返回结果
-- distinct示例1 select a.* from t2 a,(select distinct c1 from t1) b where a.c1=b.c1; -- distinct示例2 select distinct a.* from t2 a,t1 b where a.c1=b.c1; --exists示例 select * from t2 a where exists (select c1 from t1 b where a.c1=b.c1);
- Count 如果有可以确定唯一的索引比如id,可以使用 count(id),如果这个表没有索引直接使用count(*)即可
COUNT(*)与COUNT(列)比较 无索引 一样快 有索引,且索引列的属性允许为空 COUNT(列)快 有索引,且索引列的属性不允许为空 一样快