开发/数据库

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 开发/数据库

SQL不要这样写 赶紧看看你犯错了没?

作者:51CTO出处:论坛2018-10-17 17:15

SQL作为常用的一种语言,得到非常广阔的运用。但是,有些SQL的执行效率异常的差,造成了数据库的负担。我们通过分析这些有问题的SQL,就可以发现很多我们平时在写SQL的时候忽略的问题。

赶紧来看看,这些错误你犯过没?有的话,一定要及时改掉。

尽量少用负向条件查询

假设我们有一个Order表,表中有一个字段是Status,这个字段有4个值,分别是0=待支付、1=待发货、2=待收货、3=已完成。

这时,我们要查询所有已经支付的订单,很多人就会写这样的SQL:

  1. select * from Order where Status != 0 

这就是一个不好的习惯了。负向条件查询(例如:!=、not in、not exists)都是不能使用索引的,当Order表中的数据到达一定量级时,这个查询的效率会急剧的下降。

不要这样写SQL 改掉这些坏习惯

所以,正确的写法应该是:

  1. select * from Order where Status in (1,2,3) 

尽量少用前导模糊查询

假设我们现在要根据用户的订单号(OrderNo)查询用户的订单,如果是直接通过SQL查询的话,尽量不要使用前导模糊查询,也就是:

  1. select * from Order where OrderNo like '%param' 

或者

  1. select * from Order where OrderNo like '%param%' 

因为,前导模糊查询是无法命中索引的,所以,会整个数据库去检索,效率相当的差,而非前导模糊查询则是可以使用索引的。

不要这样写SQL 改掉这些坏习惯 

因此,我们尽量不要把通配符放在前面,改成下面这样:

  1. select * from Order where OrderNo like 'param%'  
不要这样写SQL 改掉这些坏习惯 

尽量不要在条件字段上进行运算

假设,现在有一个需求,是要查询2018年全年的订单数据,我们就需要通过创建时间(CreateTime)来进行检索,但是,有些程序员就喜欢这样写SQL:

  1. select * from Order where Year(CreateTime)=2018 

然后,每次执行时就会发现,查询的速度异常的慢,导致了大量的请求挂起甚至超时。这是因为,我们即使在CreateTime上建立了索引,但是,如果使用了运算函数,查询一样会进行全表的检索。

不要这样写SQL 改掉这些坏习惯 

所以,我们可以改成这样:

  1. select * from Order where CreateTime > '2018-1-1 00:00:00' 

当查询允许Null值的列时,需要特别注意

我们在创建表的字段时,如果这个字段需要作为索引时,尽量不要允许Null。因为,单列索引不会存Null值,复合索引不存所有索引列都为Null的值,所以如果列允许为Null,可能会得到“不符合预期”的结果集。

例如:我们有一个User表,其中有UserName字段记录了用户的名字,并且添加了索引。

不要这样写SQL 改掉这些坏习惯

现在我们执行了这样一个查询:

  1. select * from User where UserName != '小倩' 

但结果是这样的

不要这样写SQL 改掉这些坏习惯  
不要这样写SQL 改掉这些坏习惯 

那位UserName为Null的数据并没有能包括进来。因此,如果我们想要包含这个用户的话,最好能够设置一个默认值。

相关文章

关键词:SQL,SQL数据库,SQL错误

责任编辑:林音子

网警备案