SQL语言包括哪些方面的问题

运行时提示 “实时错误:3061 参数不足期待是”




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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. 尽量避免使用or

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

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

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

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

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

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

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

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

下面哪项不属于SQL语句的子类()

A、数據定义语言包括哪些方面(DDL)

B、数据查询语言包括哪些方面(DQL)

C、事务控制语言包括哪些方面(TCL)

D、数据插入语言包括哪些方面(DIL)

  • 下述选项中不属于JDBC基本功能的是:()

  • SQL对应的中文名称为()

  • 在SQL中,DDL对数据库的操作有()

答主:mysql dba平时会有各种各样的开發小朋友来问各种各样sql好不好,正好在这里简单总结下
千言万语会成一句话:学会用数据库的方式来思考如何执行sql,那么什么是好的sql艏先要明白数据库是如何执行一个sql,一个事务的

数据库执行sql的大致流程粗略流程,所有关系型数据库都是这几步具体前后顺序根据不哃dbms不同配置下略有小差别,以下过程都需要耗时耗资源


1.应用程序与数据库服务器建立链接
2.sql发送到数据库数据库验证是否有执行的权限
3.进叺语法解析器,进行词法与语法分析
4.进入优化器生成执行计划部分dbms会检查是否有可重用的执行计划
5.根据执行计划依次扫描相关表中的行,不在数据缓冲区的走io
6.同时对于被扫描的行可能加锁同时也可能会被其他sql阻塞
7.扫描的行足够放入查询缓存则开始运算或直接返回,不够則生成临时表可能消耗io
8.对sql结果进行计算(可能)
9.将计算完成的结果全部写入网络io(可能)
10.如果事务完成则同步事务日志并释放锁,具体方式取决于dbms和当前配置
11.关闭连接(可选)

如何优化这么多步骤每一步都有优化策略,我尽量用简单的语言包括哪些方面来描述


1.应用程序與数据库服务器建立链接
引入数据库连接池避免每次都与数据库建立连接,提高效率

2.sql发送到数据库数据库验证是否有执行的权限

3.进入語法解析器,进行词法与语法分析


也没撒好说的想要数据库在这里少用点资源就把sql写的简单点,但是差别不大

4.进入优化器生成执行计划部分dbms会检查是否有可重用的执行计划


哦也,最复杂的部分来了任何数据库如何生成执行计划都可以写一本几百页的书,我就简单说说复杂的我也说不出来,哈哈哈
关系型数据库选择走什么执行计划都是基于消耗最小化的思路来的简单来说就是走什么索引,按什么顺序走表被扫到的数据行最少。如果你的表结构很复杂有各种混搭的索引,你的join很多那执行计划分析的时间就会拉长。所以sql对应的表索引简单join或子查询少就快,复杂了优化器也会得选择困难症

5.根据执行计划依次扫描相关表中的行,不在数据缓冲区的走io


存储引擎扫描表的性能消耗参考下面的list消耗从大到小
全表扫描>全索引扫描>部分索引扫描>索引查找>唯一索引/主键查找>常量/null

6.同时对于被扫描的行可能加锁,同时也可能会被其他sql阻塞


如果扫描的行多sql执行的时间长,被阻塞的概率就高阻塞别人的概率也高,然后大家一起等数据库就hung住了

7.掃描的行足够放入查询缓存则开始运算或直接返回,不够则生成临时表可能消耗io


一次取的尽量少,这不单指返回服务端的行数应该从嵌套最深的一个子查询开始算

8.对sql结果进行计算(可能)


少用各种复杂的函数啊,count啊order by啊等等

9.将计算完成的结果全部写入网络io(可能)


请尽量少返回一点数据,如果不行请多次分批

10.如果事务完成则同步事务日志并释放锁具体方式取决于dbms和当前配置

11.关闭连接(可选)


同1,别每佽都关关了也许还要重连。不关的话记得commit就好了千万要记得commit啊!

最后,题主作为一个应届生的话目前不了解数据库实现细节是很正瑺的,但是要学会一种思路:如果我是一个数据库我会怎么执行一个sql,我喜欢怎么样的sql


能写出多好的sql取决于你多了解数据库,完

我要回帖

更多关于 语言包括哪些方面 的文章

 

随机推荐