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

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

今天,我们就来讲一下这些需要改掉的坏习惯。

尽量少用负向条件查询

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

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

  1. select * from Order where Status != 0

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

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

  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%‘

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

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

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

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

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

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

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

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

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

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

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

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

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

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

但结果是这样的

  

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

复合索引,使用时要注意顺序

登录,肯定是我们使用得最多的一个查询了,为了保证效率,我们为LoginID和Password加上了复合索引。

当我们使用

  1. select * from User where LoginID = ‘{LoginID}‘ and Password = ‘{Password}‘select * from User where Password = ‘{Password}‘ and LoginID = ‘{LoginID}‘

查询时,都是能够准备的命中索引。当我们使用:

  1. select * from User where LoginID = ‘{LoginID}‘

查询时,也是能够命中索引的。但是,当我们使用

  1. select * from User where Password = ‘{Password}‘

查询时,确无法命中索引,这是什么原因呢?

这是由于,复合索引对于查询的顺序是非常的铭感的,所以,符合索引中包含了几种规则,其中就有全列匹配和最左前缀匹配。

当所有列都能够匹配时,虽然查询的顺序上有不同,但是查询优化器会将顺序进行调整,以满足适合索引的顺序,所以,顺序的颠倒是没有问题的。

但是,如果所有列不能匹配时,就必须满足最左前缀匹配了,也就是,必须按照从左到右的顺序进行排列。因此,当我们建立是索引是

结果唯一时,别闷着

通常,我们设计User表时,并不会把LoginID作为主键,但是,LoginID确会在业务逻辑中验证唯一性,因此,如果使用

  1. select * from User where LoginID = ‘{LoginID}‘

查询时,结果一定只有一条。但是,数据库是不知道的,即使找到了这唯一的一条结果,他也会一直继续,直到扫描完所有的数据。

因此,在执行这样的查询时,我们可以优化一下,改成:

  1. select * from User where LoginID = ‘{LoginID}‘ limit 1

这样,当查询到结果时,就不会再继续了。

最后,上面所有的例子都是坑

尽量少用或别用Select *,我们的查询其实都是有目的的,就好像登录一样,我们其实只需要知道有结果返回就行了,使用select count(0)就可以了,但是我们使用select * 的话,就会消耗大量无效的数据库内存。

原文地址:https://www.cnblogs.com/syncnavigator/p/10198289.html

时间: 2024-11-03 22:19:26

不要这样写SQL 改掉这些坏习惯的相关文章

改掉这些坏习惯,你不在是菜鸟

改掉这些坏习惯,你不在是菜鸟 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3. 从未用过任何形式的版本控制系统,如Subclipse 4. 不采用某种编码与命名标准,以及通用约定,不能在项目开发周期里贯彻落实 5. 不使用统一开发方式 6. 不转换(或)也不验证某些输入或SQL查询串(译注:参考PHP相关函数) 7. 不在编码之前彻底规划你的程序 8. 不使用测试驱动开发 9. 不在错误开启状态下

改掉这些坏习惯,你不再是菜鸟

1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3. 从未用过任何形式的版本控制系统,如Subclipse 4. 不采用某种编码与命名标准,以及通用约定,不能在项目开发周期里贯彻落实 5. 不使用统一开发方式 6. 不转换(或)也不验证某些输入或SQL查询串(译注:参考PHP相关函数) 7. 不在编码之前彻底规划你的程序 8. 不使用测试驱动开发 9. 不在错误开启状态下进行编码和测试(译注:参考PH

成为优秀程序员要改掉的坏习惯

盲目地剪切/粘贴代码.作为程序员复用会拷贝/粘贴很重要,但更重要的是知道自己在做什么.别人的东西你可以拿过来用,但你要对其完全理解,并且要为拿过来后出现的问题负责. 总是说“一会弄好”,但从来不兑现.(缺乏任务管理和时间管理能力)之前有个同事这个现象很严重,沟通时说的很好,结果从不兑现,出现问题时也不会主动反馈,到问他要成果物时却以各种借口说没做到. 分不清事情的优先级,盲目的加班.无意义的优化.工作中也比较常见,很多人加班时间很长,但总做不出很亮眼的成果. 总觉的别人做的不好,喜欢自己重复造轮

做事效率太低?你必须改掉这7种坏习惯

成为啊噗星人 搜索微信号:apu_app,订阅啊噗微信,不定期有惊喜,要关注起来哦! 许多创业者每天都忙到停不下来,然而,拼命的工作无法让你战胜数百万的竞争对手.时间总是有限的,一个创业者可以每天工作24小时,每周工作7天.但是竞争对手只需多花一点钱,就能建立起更优秀的团队,这样你所花费的一切时间就都白费了.也许有人要问:"那为何许多小型企业完成了大企业无法完成的工作?"例如Facebook花费数十亿美元收购了只有13名员工的Instagram:Snapchat这个只有30名员工的初创

(转)理解SQL原理,写出高效的SQL语句 Sql养成一个好习惯是一笔财富

我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗? 要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用 profile来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把

MM们开车要改掉的几个坏习惯

美女开车坏习惯一:车前车后,悬挂饰物 俗话说,"爱美之心,人皆有之",女人尤其如此.除了将车车打扮得花枝招展之外,还喜欢在爱车里左一串右一串地悬挂一些自己喜欢的饰物.这些很美很漂亮的饰物,会挡住女魔头从后视镜里观望路况的视线,自然影响开车安全.    美女开车坏习惯二:带宠物开车    狗狗撒娇,车撞护栏,宠物成为越来越多家庭的重要"成员".交警说,在路上经常能看到宠物坐在副驾驶座位或后排,一起出行.这看似温馨的场面下,却隐藏着危险.    美女开车坏习惯三:不看后

SQL Server 要避免的编程坏习惯

摘自 <SQL Server MVP Deep Dives Vol.2> 使用select * 会返回不需要的列,增加磁盘和网络开销 如果view的定义里用了select *, 而底层的表有列名的变化的时候,view仍然会返回原来的列 IF OBJECT_ID('tb1') IS NOT NULL DROP TABLE tb1 GO CREATE table tb1(id int) GO IF OBJECT_ID('v1') IS NOT NULL DROP VIEW v1 GO CREATE

低效程序员的7个坏习惯

程序员总是想做到尽可能的高效,但很多人往往会觉得力不从心.这是因为他们在多年的编码过程中养 成了一些不好的习惯.下面这7个坏习惯绝对是软件工程师需要改掉的. 1.缺乏激情 这已经是一个老生常谈的话题了,但却是真理.写了多年的代码后,程序员们很可能会失去激情,只想着做一天和尚撞一天钟.更糟糕的是,这种情绪会像瘟疫一样 传染给周围的人. "即使写了一整天的代码,你也应该在午餐和下班后对它津津乐道,"Liz Eggleston,Course Report--提供学习编码在线资源的联合创始人这

影响你35岁前成功的好习惯与坏习惯

你想成功吗?那就及早培养有利于成功的好习惯. 习惯的力量是惊人的,35岁以前养成的习惯决定着你是否成功. 有这样一个寓言故事:一位没有继承人的富豪死后将自己的一大笔遗产赠送给远房的一位亲戚,这位亲戚是一个常年靠乞讨为生的乞丐.这名接受遗产的乞丐立即身价一变,成了百万富翁.新闻记者便来采访这名幸运的乞丐:“你继承了遗产之后,你想做的第一件事是什么?”乞丐回答说:“我要买一只好一点的碗和一根结实的木棍,这样我以后出去讨饭时方便一些.”可见,习惯对我们有着绝大的影响.因为它是一贯的,在不知不觉中,经年