sql问题总结

本文详细阐述了数据库中的行式存储原理,强调了select*效率低下的问题,列举了不走索引的多种情况,并提供了19条SQL优化建议,包括合理使用索引、避免计算和函数等,帮助提升查询性能。
摘要由CSDN通过智能技术生成

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)两表连接时小表去动大表[谁是驱动表谁就全表扫描](有索引的情况下)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值