1、select *
-->普通数据库用的都是行式存储,大部分情况下select * 和select具体列的差异不大
-->如果表中有CLOB或者BLOB等字段,那么select * 的效率就会大大降低,这些数据不能被缓存
-->如果查询内容在索引里,直接select索引,效率更高
2、不走索引的一些情况:
(1)select * from A where 索引='条件'[会一行行搜索]、select 索引 from A where 索引=‘条件’[
直接去找索引B树中可以找到];
(2)单键值的B树索引列上存在null值,count(*)不能走索引;
(3)索引列上游函数运算,不走索引;
(4)隐式转化不走索引[where varchar2 = int,查询.的时候回to_number(varchar2)=5];
(5)表的数据库小或者需要选择大部分数据,不走索引;
(6)cbo优化器统计信息不准确,导致不走索引(概率比较低);
(7)!=/<>,可能不走索引,也可能走index fast full scan [例如select id from A where id<>100];
(8)表字段属性导致不走索引,字符型索引列会导致局蹙因子很大[不推荐使用字符串作为主键,因为占
用空间大/降低查询性能]
3、sql优化的方法
(1)使用索引:注意索引太多会加重数据库的负担,另索引出超过一定比例索引会失效(最好保持在6个以
内),所以列不要有 null,也不要is null 或者is not null
(2)避免where子句对列的计算,不走索引,非用不可的话,可以放在条件上[where a*12 > 1000 写成
where a > 1000/12]
(3)避免使用子查询
(4)避免使用%开头的模糊查询
-->'%列'、'%列%'不走索引,'列%'走索引
(5)使用limit分页,一次查询出太多的数据也会非常慢
(6)避免使用having,会影响效率,尽量用where进行过滤
(7)尽量避免使用or语句,or会导致全表扫描影响效率
(8)使用exists代替in
-->exists先查询外表,然后剑结果放入exists子查询中进行验证,true保留,false丢弃
-->in先查询内表,将内标的结果当做添加供给外表进行比较
-->所以:外表小内表大时exists比in效率高;外表大内表小in比exists效率高
(9)union all 代替union
-->union会对结果去重,union all不做这么做
(10)使用order by避免使用函数
(11)避免使用temporary table
-->存储临时表会消耗大量资源
(12)尽量使用内连接(inner join)
-->过滤掉不符合的数据提高效率
(13)尽量避免使用字符串函数
-->len和substr等字符串函数会消耗资源
(14)尝试使用视图
(15)使用explain查看执行计划
(16)如spring使用了事务,不要拉的太长
(17)链表字段、where字段、排序字段、分组字段最好都加上索引
(18)sql执行顺序
-->mysql从左向右,自上而下,where的时候遵循一个余额则->过滤越多的条件越要放在前面
-->sql server、orcale,从右往左,自下而上,->过滤越多的条件越要放在末尾
(19)条件>= 代替 > ; union 太低or(索引); in 代替or(oracle8i一下差距不大) ;
(20)两表连接时小表去动大表[谁是驱动表谁就全表扫描](有索引的情况下)