专栏首页猴子聊数据分析图解面试题:如何提高SQL查询的效率?
原创

图解面试题:如何提高SQL查询的效率?

​【题目】

我们公司的数据量非常大,需要的不仅仅是提取数据,要了解SQL方案优化的。一般在写SQL时需要注意哪些问题,可以提高查询的效率?

【解题思路】

数据量大的情况下,不同的SQL语句,消耗的时间相差很大。按下面方法可以提高查询的效果。

1. select子句中尽量避免使用*

select子句中,*是选择全部数据的意思。比如语句:“select * from 成绩表”,意思是选择成绩表中所有列的数据。

在我们平时的练习中,往往没有那么多数据,所以很多同学会图方便使用*。而在处理公司事务时,动辄十万、百万,甚至上千万的数据,这个时候再用*,那么接下来的几分钟就只能看着电脑屏幕发呆了。

所以,在我们平常的练习中,就要养成好的习惯,最后需要哪些列的数据,就提取哪些列的数据。尽量少用*来获取数据。

另外,如果select * 用于多表联结,会造成更大的成本开销。

2. where子句比较符号左侧避免函数

尽量避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。

举个例子,下图是10名学生的成绩表,老师突然发现因为参考答案出错,给所有人都少加了5分,现在需要查询:给每人加5分后,成绩依然在90分以上的同学的学号。

按照题目的思路直接书写,“给每人加5分后,成绩90分以上”的条件很多人会这样写:

where 成绩 + 5 > 90  (表达式在比较符号的左侧)

优化方法:

where 成绩 > 90 – 5(表达式在比较符号的右侧)

所以,为了提高效率,where子句中遇到函数或加减乘除的运算,应当将其移到比较符号的右侧。

3. 尽量避免使用in和not in

in和not in也会导致数据库进行全表搜索,增加运行时间。

比如,我想看看第8、9个人的学号和成绩,大多数同学会用这个语句:

select 学号, 成绩 

from 成绩表 

where 学号 in (8, 9)

这一类语句,优化方法如下:

select 学号, 成绩 

from 成绩表 

where 学号 between 8 and 9

4. 尽量避免使用or

or同样会导致数据库进项全表搜索。在工作中,如果你只想用or从几十万语句中取几条出来,是非常划不来的,怎么办呢?下面的方法可替代or。

从成绩表中选出成绩是是88分或89分学生的学号:

select 学号 

from 成绩表 

where 成绩 = 88 or 成绩 = 89

优化后:

select 学号 from 成绩表 where 成绩 = 88

union

select 学号 from 成绩表 where 成绩 = 89

语句虽然变长了一点,但处理大量数据时,可以省下很多时间,是非常值得的。

5.使用limit子句限制返回的数据行数

如果前台只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limt子句来限制查询返回的数据行数。

【本题考点】

在面试中,当面试官提出这一类问题,按照上述的方法进行回答都是没有问题的,但不仅在面试中,平时练习就养成习惯是最好的。

大多数同学都会觉得“麻烦”、“不做也没有什么影响”,但是习惯总是慢慢养成的。

拥有好习惯,未来在工作中,面对不同的数据量,就可以游刃有余地选择不同的方法来降低完成时间,从而提升工作效率。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CentOS7安装部署LNMP环境

    泽阳
  • 0714-1.5.0-CDSW数据库登录失败异常分析

    Fayson在前面的文章《后台查找CDSW中用户的审计日志》,讲述了如何通过访问CDSW的PG数据库查找用户的审计日志,今天Fayson在1.5.0版本的CDS...

    Fayson
  • 群邮件钓鱼软件的简单分析并拿到后台

    不知道从何时起,qq群邮件就成为了钓鱼软件传播的一个绝佳场所,什么“”萌妹变声器”,“破解UU加速器”。 我偶尔闲的无聊的时候,就会下载下来耗费几分钟逆(ti...

    xuing
  • Jenkins+InfluxDB+Grafana 收集构建数据

    泽阳
  • SQL Server 2017 Linux安装说明以及避坑指南

    SQL Server可以装到Linux下啦~但是网上的资料还是很少,并且emmmm,中文的资料的质量普遍偏低。这里把坑跟大家分享一下。

    xuing
  • 如何升级到最新LTS版本SonarQube 7.9.1 ?

    写个for循环,循环执行。执行两次该脚本(因第一次分析的时候没有缺陷会不显示数据)

    泽阳
  • 「首席看HANA」SAP HANA的秘密- 不要告诉任何人

    简单的方法是两者都做,例如以柱状和行状两种格式存储数据。通过这种方式,用户可以访问其中之一,或者其他更有意义的。当然,这个选择是有代价的。在这种情况下,数据需要...

    首席架构师智库
  • 【DB笔试面试662】在Oracle中,对于错误“ORA-08104”应该如何处理?

    在Oracle中,对于错误“ORA-08104: this index object 68111 is being online built or rebuil...

    小麦苗DBA宝典
  • 【面试现场】为什么 MySQL 数据库要用B+树存储索引?

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。

    五分钟学算法
  • SonarQube实践文档(一)

    泽阳

扫码关注云+社区

领取腾讯云代金券