关于数据库查询优化之sql随笔(初识)


以前写sql时没有想过太多,觉得能达到效果就好,所以一直没有特别在意什么样的语句应该用在什么场合,直到前一阵子客户总是说什么某某模块查询起来很慢要10几分钟,我才渐渐开始注意这个事情。因为这个项目的数据库表数据动则几百万,如果不考虑优化真的是让人等的痛不欲生啊。

第一弹、子查询中慎用函数;

为啥这么说呢,因为函数是一个封装好的方法,数据库在调用方法时需要有一个调用的过程(编写过c的应该都知道机器在执行调用函数时,是需要多做很多事情的。比如要先出栈等)。所以使用函数是会多出一些开销的,但并不是说就不使用函数。而是说不要使用没有必要的函数造成资源浪费。

Select* ,(select  top 1 card from table2 wheretable1.name=table2.name and table2.time=convert(varchar(30),getdate(),121))  from table1

比如上面这句sql子查询中出现了convert(varchar(30),getdate(),121))方法,但是实际上我们只是想获取当前时间仅此而已,如果table1查询了100次,那么上面的方法就重复调用了100次,显然我们只需一次就足够了。所以我们可以考虑通过变量来替换它,从而节约开销提升速度。

第二弹、尽量避免全表扫描;

用过数据库的人,应该都知道每个数据库都是有一套自己的编译优化机制的。也就是通过一些算法来实现资源的保护。(就比如同样是查询,key-value就可以快速的找到需要的内容,而以前需要一一比对,直到找到需要的内容为止。),数据库是可以通过索引来快速定位数据的,所以为了避免全表扫描我们一般会在经常需要用来作为查询条件的字段上加上索引的方式来提升查询效率。但是虽然我们创建了索引,这只是说明了我们具备了提升速率的能力而并不是说我们无论使用什么样的方式查询都会高效。因为有些语句是会迫使数据库引擎放弃使用索引而进行全盘扫描的。就是说如果你的sql中不可避免的会出现下面的语句,就可以选择放弃构建索引了,因为这样反而会更慢。

1、比如where 子句中进行判空条件时,会放弃索引。

Select * from table1 where name is not null

2、where子句中出现!=或<>时,会放弃索引

select * from table1 where name<>’wang’

3、where子句中出现in,not in时也会放弃索引

select * from table1 where flag in (‘1’,’2’,’3’)
4、where子句中出现模糊查询时,也会放弃索引

select * from table1 where name like ‘%an%’
5、where子句中出现变量,也会放弃索引,

select * from table1 where name=@name
6、where子句中出现字段表达式时,也会放弃索引

select * from table1 where name*3=90
7、where子句中出现字段进行方法使用时,会放弃索引

select * from table1 where left(name,3)=’wan’
8、where使用or时,如果有一侧的字段是无索引的,也会放弃索引

select * from table1 where id(有索引)=’2’or name(无索引)=’wang’
第三弹、尽量从业务层面来优化sql;

因为这种优化才是更有针对性的优化方式,也是实际开发最长用的优化方式。

注意:以上都是针对数据量很大的查询,如果你的数据量不是很大,那么使用上述方式可能会南辕北辙。这个要具体分析。希望对你有帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值