您当前的位置: 首页 >  sql

川川菜鸟

暂无认证

  • 3浏览

    0关注

    969博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

只知道SQL数据库?又一国产数据库语言诞生了

川川菜鸟 发布时间:2022-04-01 13:16:31 ,浏览量:3

一、为什么学习数据库?

学习数据库,你肯定需要先了解它,这样你才知道你为什么要学习它,数据库除了SQL还有一些别的数据库,了解它们的作用,可以在不同的场景选择最符合的一个数据库。

1.1 什么是数据库?

首先你的先知道数据库的作用是什么,数据库的定义:数据库是结构化信息或数据的有组织的集合,通常以电子方式存储在计算机系统中。数据库通常由数据库管理系统 (DBMS)控制。数据和 DBMS 以及与之关联的应用程序一起被称为数据库系统,通常简称为数据库。

数据库的组件:硬件,软件,数据,程序,访问语言。 在这里插入图片描述

1.2 数据库有啥优点?

列举以下几点,来说明为什么学习数据库:

  1. 数据库可以有效地存储大量记录(占用的空间很小)
  2. 海量的数据中很容易找到需要的信息,给你一万条数据你用眼睛找?
  3. 容易添加新的数据以及编辑或删除已有的数据
  4. 可以轻松搜索数据,比如有一对蔬菜的数据,你只想查找所有白菜的数据?
  5. 数据可以轻松排序,比如有一万个人注册网站,你想根据注册时间排序?也许只需要一行语句
  6. 多人可以同时访问同一个数据库,这样可以多人管理,而且每个人的全选可能不一样,一个大型数据库可以每个人负责一部分
  7. 安全性可能比纸质文件更好,比存储到本地的文档好,这是毋庸置疑的!
1.3 数据库有啥用途?偏偏要学它

这里我依然举例子来说明它的用途:

  1. 警方在数据库中有所有已知罪犯的详细信息,例如他们犯下的罪行
  2. 学校使用数​​据库来存储学生的详细信息,例如每个人的成绩
  3. 医院会将所有患者的详细信息存储在数据库中,例如他们的病历
  4. 政府使用数据库存储人们的所得税支付记录
  5. 如果过路费不在人工,一个数据库用于跟踪上海中心所有已支付过路费的司机,如果未支付就通过就要对他罚款。再比如无人超市?
二、为什么不选择SQL?

我们需要知道以下SQL的优缺点,才能知道是否选择它。这里列举SQL的缺点:

  1. 安全:无论 SQL哪个 版本,SQL 中的数据库都经常受到威胁,因为它拥有大量敏感数据。
  2. 速度:随着 SQL 数据库变得越来越大,大量表之间所需的查找和连接可能会减慢速度!
  3. 可靠性:SQL 很难实现高性能算法,大数据操作的性能只能依靠数据库的优化引擎,但在复杂情况下往往有些不可靠。 在这里插入图片描述
2.1 使用SQL处理亿量数据太难了!

很多大数据计算都是用SQL实现的,跑得慢时就要去优化SQL,但常常碰到让人干瞪眼的情况。比如,存储过程中有三条大概形如这样的语句执行得很慢:

 select a,b,sum(x) from T group by a,b where …;   
 select c,d,max(y) from T group by c,d where …;  
 select a,c,avg(y),min(z) from T group by a,c where …;

这里的T是个有数亿行的巨大表,要分别按三种方式分组,分组的结果集都不大。分组运算要遍历数据表,这三句SQL就要把这个大表遍历三次,对数亿行数据遍历一次的时间就不短,何况三遍。

这种分组运算中,相对于遍历硬盘的时间,CPU计算时间几乎可以忽略。如果可以在一次遍历中把多种分组汇总都计算出来,虽然CPU计算量并没有变少,但能大幅减少硬盘读取数据量,就能成倍提速了。

如果SQL支持类似这样的语法:

from T --数据来自T表 
 select a,b,sum(x) group by a,b where …   --遍历中的第一种分组     
 select c,d,max(y) group by c,d where …   --遍历中的第二种分组     
 select a,c,avg(y),min(z) group by a,c where …; --遍历中的第三种分组

能一次返回多个结果集,那就可以大幅提高性能了。

可惜, SQL没有这种语法,写不出这样的语句! 在这里插入图片描述

只能用个变通的办法,就是用group a,b,c,d的写法先算出更细致的分组结果集,但要先存成一个临时表,才能进一步用SQL计算出目标结果。SQL大致如下:

 create table T\_temp as select a,b,c,d,  
     sum(case when … then x else 0 end) sumx,  
     max(case when … then y else null end) maxy,   
     sum(case when … then y else 0 end) sumy,   
     count(case when … then 1 else null end) county,  
     min(case when … then z else null end) minz 
     group by a,b,c,d;
 select a,b,sum(sumx) from T\_temp group by a,b where …;  
 select c,d,max(maxy) from T\_temp group by c,d where …;  
 select a,c,sum(sumy)/sum(county),min(minz) from T\_temp group by a,c where …; 

这样只要遍历一次了,但要把不同的WHERE条件转到前面的case when里,代码复杂很多,也会加大计算量。而且,计算临时表时分组字段的个数变得很多,结果集就有可能很大,最后还对这个临时表做多次遍历,计算性能也快不了。大结果集分组计算还要硬盘缓存,本身性能也很差。

还可以用存储过程的数据库游标把数据一条一条fetch出来计算,但这要全自己实现一遍WHERE和GROUP的动作了,写起来太繁琐不说,数据库游标遍历数据的性能只会更差!只能干瞪眼! 在这里插入图片描述

TopN运算同样会遇到这种无奈。举个例子,用Oracle的SQL写top5大致是这样的:

 select \* from (select x from T order by x desc) where rownum=date(“2021-01-10”) && tdate            
关注
打赏
1665165634
查看更多评论
0.1940s