此数据库系列,是学习工作中的总结,具体章节系列如下图所示。如果您需要扫盲数据库,突击数据库的面试,那就盘他,盘他!所谓初恋,初次见面,下凡数据库基础。请多多关照!

童鞋别被脱裤系列

这是系列篇第一节,其主要内容如下思维导图所示。如太简单,文末在看走起!

数据库基础

1 了解sql----长生不老,异常稳定

查看近几年的TIOBE发现了,一直在前十,可见是个老且管用的东西。

来自网络

了解几个术语:

  • DDL(Data Definition Language),定义数据库对象。

  • DML:(DATA Manipulation Language),用来操作和数据库相关记录。

  • DCL:(Data Cnotrol Language)定义访问权限和安全级别。

  • DQL(Data Query Language)。查询记录。

sql大小写规范

  • 表名、表别名、字段名、字段别名等可以小写

  • SQL保留字,函数名,绑定变量大写

SELECT name,age FROM student WHERE id="1";

2 为啥要存储数据

我们大部分的系统都会考虑到数据的存储,那么如何更有效地保存好数据,做好数据备份。当我们拥有了数据,可以进行数据挖掘,大数据分析,舆情预测,自然语言处理等等一系列的骚操作,可见存储数据是多么的重要。这一篇文章对数据库基础知识的扫盲,下一节将是数据存储,数据备份等。另外我必须要知道硬盘的处理速度比cpu,内存,网卡都会慢哟。

3 DBMS是什么

  • DB、DBS和DBMS区别

全称 功能
DBMS DataBase Management System 可对多个数据库进行管理
DB DataBase 存储数的集合,理解为多个数据表
DBS DataBase system 老大哥。包含了数据库管理系统和数据库管理人员DBA

4 当前主流的DBMS有哪些

主流的DBMS

5 sql与Nosql

Nosql的Timestamp:

1970:Nosql=we have no sql

1980:Nosql=know sql

2000:Nosql=No SQL

2005:Nosql=not only sql

2013:Nosql=No,SQL

键值数据库

通过key-value方式存储,key为唯一表示,优点,查询快,缺点是无法像关系型数据库一样使用条件过滤,这样可能导致遍历所有的键,消耗大量的计算。所以经常用来作为缓存,比如redis。

文档数据库

管理文档,一个文档相当于一条记录,MongoDB。

搜索引擎

虽然关系型数据库常常通过索引的方式提高检索效率(不一定),但是对于全文检索却比较低。搜索引擎的优势比如Elasticsearch、Splunk和Solr采用全文搜索,核心原理为倒排索引

列式数据库

相对于行式数据库,将数据按照列存储,这样可以大量降低系统的IO(因为相邻的数据类型一样,方便压缩,自然就会降低IO),适合分布式文件系统,比如

图数据库

典型的就是网络中的人与人的关系,节点和边关系。

6 Oracle中的sql如何执行的

查询执行流程
  • 语法检查:检查SQL拼写是否正确。

  • 语义检查:检查SQL访问对象是否存在。

  • 权限检查:检查用户是否有访问权限。

  • 共享池检查:包含了库缓存、数据字典缓冲区等。主要用来缓冲执行计划或者表、视图等对象。

  • 优化器:进行硬解析,决定创建解析树和生成执行计划应该怎么做

  • 执行器:有了优化器,那么在执行器思考如何被执行

7 mysql中sql如何执行的

查询执行流程
  • 查询缓存

首先注意,mysql8.0之后已经放弃了这个功能(因为如果数据更新,缓存会清空,如果为动态数据经常更新,这样反而增加SQL查询时间)。缓存通常的理解是一个中间层,如果在中间层存在查询语句就直接返回,如果没有则给解析器处理。

  • 解析层

主要进行语法分析和语义分析。

  • 优化器

确定SQL语句的执行路径。是根据全表检索还是根据索引。

  • 执行器

进行权限检查。

那么mysql和oracle两者执行情况有啥不一样呢

MySql具有多种存储引擎且可以自定义存储引擎,那么有哪些存储引擎,优点缺点是啥?

描述
InnoDB Mysql5.5以后默认存储引擎,支持事务,行级锁,外键约束
MyISAM Mysql5.5以前为默认存储引擎,不支持事务和外键,最大特点速度快,占资源少
Memory存储引擎 使用系统内存为存储介质,更快的响应速度。
NDB存储引擎 用于Mysql Cluster分布式集群环境
Archive存储引擎 压缩机制的特点便于文件的归档,常用来做仓库

8 如何查看一条sql的资源使用情况

  • prifiling是否开启

mysql> select @@profiling;如果为0代表关闭,设置为1表示打开。

  • 执行sql查询语句

mysql> select *from student;

  • 查看当前所有profiles

show profiles;查看当前会话的profiles

  • 查看执行时间show profile

9 DDL

  • 创建数据库

  • 创建公众号原创作者数据库

CREATE DATABASE WeChat_Official_Account_Author;

  • 创建表结构(注意语句最后;结束,最后一个字段定义结束没有逗号)

CREATE TABLE authors_name(author_id int(15) NOT NULL AUTO_INCREMENT),author_name varchar(255) NOT NULL);

  • 添加字段

ALTER TABLE  authors_name ADD(age int(12));

  • 修改字段名

ALTER TABLE authors_name RENAME_COLUME age to author_age;

  • 删除字段

ALTER TABLE author_names DROP COLUME author_age;

10 数据库的常见约束

不成规矩,不成方圆

  • 主键约束

唯一标识一条记录,不重复且不能为空(UNIQUE+NOT NULL)。主键可以使是一个字段或者多个字段的组合,一个数据表主键只能有一个

  • 外键约束

外键确保表与表之间引用的完整性。外键可以重复也可以为空。

  • 唯一性约束

字段在表中可以使唯一的。

  • NOT NULL约束

表明字段不应为空,必须有取值。

  • CHECK约束

检查特定字段取值范围的有效性

11 常见查询语句

  • 查询姓名列

  • 查询单列和查询多列

SELECT author_name FROM authors_name;

SELECT * FROM authors_name;

  • 去除重复行

SELECT DISTICT age   FROM authors_name;

  • 查询排序(ASC 递增排序,DESC递减排序)

SELECT  author_name FROM authors_names ORDER BY age DESC;

  • 约束返回结果的个数(返回5条数据 LIMIT需要放在最后)

SELECT  author_name FROM authors_names ORDER BY age DESC LIMIT 5;

  • SELECT语句中关键字顺序

关键字的顺序:SELECT…..FROM…WHERE…GROUP BY

  • SELECT语句的执行顺序

FROM>WHERE>GROUP BY HAVING>SELECT

  • 那么一句select的执行顺序原理是什么?请看下图。

一句select经历了啥

12 sql运算符

  • 比较运算符(不同的DBMS支持的运算符可能不同)

比较运算符
  • 逻辑运算符

逻辑运算符

当WHERE字句中同时出现OR和AND的时候,AND执行优先级会更高。一般来说()优先级最高,其次是AND,然后是OR。

  • 通配符过滤

通配符是对文本类型进行模糊查询,但是通常是全表扫描,所以效率很低。只有当LIKE后面没有通配符,并对字段进行索引的时候不会进行全表扫描。匹配一部分特殊字符。"LIKE"操作符。

  • 通配符匹配之任意字符串出现的任意次数(%)

  • 通配符匹配之耽搁字符(_)

13 常见sql函数

提供函数,类似接口,更方便快速的得出想要的结果。

描述 例子
ABS() 取绝对值 SELECT ABS(-5)---5
MOD() 取余 SELECT MOD(101,3)---2
ROUND() 四舍五入为指定的小数位数,如果两个参数,分别为字段名称和小数位数 SELECT ROUND(38.29,1)--38.3
LENGTH() 计算字段长度。一个汉字三个字符。 SELECT LENGTH('小蓝')--6
UPPER() 字符转大写 SELECT LOWER('qwe')--QWE
LOWER() 字符转小写 SELECT LOWER('QWE')--qwe
REPLACE() 替换函数 SELECT REPLACE('QWE123D','QWE',789)--789123D
SUBSTRING() 截取字符串 SELECT SUBSTRING('QWE123',1,3)--
CHAR_LENGTH() 计算机字段的长度,汉字,数字都算一个字符 SELECT CHAR_LENGTH('小蓝')--2
CONCAT() 连接字符串 SELECT CONCAT('XIAOLAN',789)---XIAOLAN789
DATA() 返回时间的日期 SELECT DATA('2020-03-13 11:30:20')--2020-03-13
YEAR()/MONTH()/DAY() 返回时间的年份/月份/天数 SELECT YEAR(NOW())--2020
HOUR() 返回时间的小时 SELECT hour('12:13:14')--12
MINUTE() 返回时间的分钟 SELECT MINUTE('12:13:14')--13
SECOND() 返回时间的秒部 SELECT SECOND('12:13:14')--14
CURRENT_DATE() 系统当前日期 SELECT CURRENT_DATE('2020-03-13 11:30:20')--2020-03-13
CURRENT_TIME() 系统当前时间,没有具体日期 SELECT CURRENT_TIME('2020-03-13 11:30:20')--11:30:20
CURRENT_TIMESTAMP() 日期+时间 SELECT CURRENT_TIMESTAMP--2020-03-13 11:30:20

14 聚集函数

描述 例子
COUNT() 总行数,不管某个字段是否为NULL SELECT COUNT(*) FROM authors_name WHERE age>25
MAX() 最大值 SELECT MAX(Age)  FROM authors_name
MIN() 最小值 SELECT MIN(Age)  FROM authors_name
SUM() 求和 SELECT SUM(Age)  FROM authors_name
AVG() 平均值 SELECT AVG(Age)  FROM authors_name
  • 数据分组

使用GROUP BY字句进行数据分组。

  • HAVING过滤分组和WHERE的区别

WHERE 是用于数据行,而 HAVING 则作用于分组。如果分组完以后需要排序,就在其后增加ORDER BY完成

17 视图

  • 什么是视图

视图可以理解为一个中间表(结果集),咋们叫虚拟表,它主要把我们经常查询的结果存放于中,从而提升使用的效率。本身不具有数据。

  • 为什么使用视图

重用SQL语句

使用表的一部分而不是整个表

更改数据格式和表示。

通过授予表的特定访问权限来保护数据

  • 使用视图过滤不想想要的数据

  • 更新视图

18 事务处理

要么完全执行,要么不执行。

  • A(Atomicity)原子性。不可分割,进行数据处理的基本单位。

  • C(Consistency)一致性。在进行事务操作以后,会从一致的状态变为另一种一致的状态。即使事务回滚也不能被破坏。

  • I(Isolation)隔离性。事务的独立性。一个事务在提交之前,对其他的事务不可见。

  • D(Durability)持久性。通过事务日志保证。即使系统崩溃,通过数据库日志的更新让系统恢复到最后一次成功的更新状态。

19 事务隔离

我们知道当在高并发的情况下,这个时候需要较高的吞吐量,那么采取方式之一就是将原来的串行操作变化为并行。这个时候可以通过降低数据库的隔离标准,来换取事务的并发能力。

讲述相关内容之前,我们先定义一个表如下。

ID Age Name
1 18 小蓝
2 19 小林
3 20 小旋
  • 脏读

小蓝今天想去看看数据库内容,并想把朋友小地增加到数据库中,于是操作如下:

SQL> BEGINT:
SQL> INSERT INTO authors value(4,20,"小地");

此时小蓝还没有提交这个事务,小林去访问了这个表(小林去年买了个表,哈哈哈嗝),于是

SQL>SELECT * FROM authors;

然后得到这个结果:

ID Age Name
1 18 小蓝
2 19 小林
3 22 小旋
4 20 小地

结论:小蓝还没有提交事务,小林访问却看到了增加的小地,这就是脏读。

  • 不可重复读

小蓝听说小地也在表里,然后想看看是为何人如此牛掰,几岁了?

SQL> SELECT Age FROM authors where Name="小地"

结果如下:

Age
20

我的天,这么年轻?小蓝试图用个事务去修改其年龄

SQL>BEGIN;
SQL>UPDATE authors SET Age = 25 where Name='小地'

此时小蓝去查询下修改是否成功

SQL>SELECT Age FROM authors where Name='小地'

结果如下:

Age
25

牛掰,修改成功?那么问题来了,小蓝虽然修改了,但是并没有提交呀,这就是不可重复读,两次查询出现了不同的结果。

  • 幻读

今天小旋过来想看看,表里都有哪些小伙伴。

SQL> SELECT *FROM authors;

结果如下:

ID Age Name
1 18 小蓝
2 19 小林
3 22 小旋
4 20 小地

这个时候小林遇到个小妹妹,发现其文采还不错,开启个事务将其放入表中。

SQL> BEGIN;
SQL> INSERT INTO authors values(5,'21','小魏')

小林记性太好了,于是还想看看到底有哪些人,

SQL> SELECT * FROM authors;

结果如下

ID Age Name
1 18 小蓝
2 19 小林
3 22 小旋
4 20 小地
5 21 小魏

啊!小林惊呆了,怎么多了个妹妹!!!这就是幻读!

  • 隔离级别

脏读 不可重复读 幻读
读未提交 允许 允许 允许
读已提交 禁止 允许 允许
可重复读 禁止 禁止 允许
可串行化 禁止 禁止 禁止

总结下:

读未提交:

允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

读已提交

只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

可重复读

可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读

串行读:

全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞.

20 python如何操作oracle

简单操作
  • 插入数据

插入数据
  • 查询数据

查询数据

21 初探调优

为什么调优,无非就是希望响应更快,吞吐量更大,用户体验更好。

那么怎么获得反馈

  • 用户

他们是直接体验者,来的直接。

  • 日志汇聚分析,服务器监控,数据库内部监控

通过性能工具进行查看,想起一张图送给大家。

这里是性能指标图

来自网络

一般从哪几个方面着手数据库调优,总之没有最好,只有更合适。

  • 前期DBMS的调研,选择合适业务的DBMS

比如需要有事务处理能力,可以选择mysql的InnoDB。如果采用如果考虑大幅度的降低系统IO,那么可以考虑Nosql中的列式数据库,之前说过列式存储方便使用压缩,但是不适合频繁的增删改。

  • 选择合适的缓存比如redis

将经常使用的数据放入缓存中(内存),提升查询效率。

  • 库级别的优化

主从架构优化读写策略,具体方法请关注系列篇第二节。

好了,上面的基础部分学习应该差不多了,那么数据库相关的优化,主从架构,读写分离,数据库的分片等都是怎么样的呢?尽请期待后续学习分享,一起成长!

参考链接:

http://www.redis.cn/

《mysql必知必会》

https://dev.mysql.com/doc/

https://blog.csdn.net/gengkui9897/article/details/89294936

《高性能mysql》

END
最后说个题外话,相信大家都知道视频号了,随着灰度范围扩大,越来越多的小伙伴都开通了视频号。小詹也开通了一个视频号,会分享互联网那些事、读书心得与副业经验,欢迎扫码关注,和小詹一起向上生长!「没有开通发布权限的尽量多互动,提升活跃度可以更快开通哦」(听我一分钟,生活更轻松)(扫码回复 1024 即可领取IT资料包)

[别被脱库]—数据库的初恋~相关推荐

  1. 21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?

    问题:对于用户信息中的密码,你会如何存储用户密码?仅仅 MD5 加密一下存储就够了吗?--哈希算法 什么是哈希算法 哈希算法的定义和原理:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规 ...

  2. data_structure_and_algorithm -- 哈希算法(上):如何防止数据库中的用户被脱库?

    最近写的文章有点杂,看上去东一点西一点,最后会在博客目录中捋顺的. 今天主要看一下哈希算法的应用,主要参考:前谷歌工程师王争的课程,感兴趣可以通过下面方式微信扫码购买: 还记得 2011 年 CSDN ...

  3. 哈希算法(一)---如何防止数据库中的用户信息被脱库?

    目录 什么是哈希算法? 应用一:安全加密 应用二:唯一标识 应用三:数据校验 应用四:散列函数 解答开篇 内容小结 课后思考 还记得 2011 年 CSDN 的"脱库"事件吗?当时 ...

  4. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 防止脱库、防止篡改数据...

    一些无关紧要的数据.被脱库了什么的, 也没啥的,但是有些比较重要的数据被脱库了,虽然可能没严重的损失,但是会很丢人一样的,被爆出脱库了什么的,总是会比较难为情的,说实话也是蛮丢人的,能多防范就多防范, ...

  5. 你的个人信息是如何被盗走的?MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

    「作者主页」:士别三日wyx 「作者简介」:CSDN top200.阿里云博客专家.华为云享专家.网络安全领域优质创作者 脱库 一.什么是脱库 二.默认数据库 三.一库三表六字段 四.脱库步骤 1)爆 ...

  6. Nacos出现重大安全漏洞,开源项目险遭脱库

    前言 大家好,我是陌溪 昨天陌溪在蘑菇博客交流群和群里的小伙伴进行了一场比较激烈的讨论,主要是关于 Nacos 中一个绕过安全认证直接获取微服务项目的配置文件的 安全漏洞. 截止到昨天为止,该 iss ...

  7. 由脱库攻击谈口令字段的加密策略——密码泄露事件杂谈之一

    (之前已经在首页上挂了一天了,放在这里只是给自己做个备份,先说明一下,看过的大仙就不必浪费时间了,由于当时文章写的非常仓促,有不周之处希望批评指正.) 我不得不惨痛地写在前面的是,这是一个安全崩盘的时 ...

  8. 聊聊数据安全,mybatis 如何有效预防脱库

    今天讲一讲数据的安全问题,我们本篇不从DBA.网络架构层面来讲述数据安全,这部分有很专业的架构和云上产品来解决,本篇重点从开发人员角度讲述如何避免数据安全的漏洞. 我相信大部分人都看到过这样的新闻,某 ...

  9. 数据安全防脱库解决方案信息泄密根源

    本文讲的是数据安全防"脱库"解决方案信息泄密根源,近日不断有黑客陆续在互联网上公开提供国内多家知名网站部分用户数据库下载,国内外媒体频繁报道,影响恶劣,引起社会广泛关注.其中涉及到 ...

最新文章

  1. 营救Peter——下载XCode的六种姿势
  2. python入门新手项目-Python入门实战项目有哪些适合新手?
  3. redis springmvc mysql_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
  4. 1 Two Sum (Array)
  5. HTTP header中的 Cache-control
  6. Spring 集成web环境
  7. 《高性能mysql》读书笔记一
  8. hdu 2188巴什博弈
  9. 扇贝有道180910每日一句
  10. 2019最新机构Web前端培训全套项目实战(完整)
  11. 绿色数据中心“东数西算”全面启动
  12. 15136-34-2,Cyclo(Leu-Trp),c(Leu-Trp),cyclo-L-Trp-L-Leu
  13. 图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)
  14. 实现现代汽车SoC功能安全的实践和挑战
  15. SQL入门之第十六讲——总结下之前的SQL语句书写顺序
  16. HDU1856(More is better)
  17. MATLAB-数据统计分析
  18. linux发广告软件下载,ADPower广告管理系统(Linux手动安装)
  19. 学习python的不知道第几天,整理一下所学内容
  20. 记一次小米8从miui12降级miui10 解决fastboot模式miflash不识别问题

热门文章

  1. 解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate
  2. 从0开始搭建ELK及采集日志的简单应用
  3. linux下lua开发环境安装
  4. php变量赋值给js
  5. 统计Apache或nginx日志里访问次数最多的前十个IP
  6. 从数据结构角度分析foreach效率比for循环高的原因
  7. PHP测试使用postman发送post请求,却报错此接口不支持get请求的原因
  8. java 国际化 properties_java Properties 读取文件,国际化
  9. PHP函数库之BC高精确度函数库
  10. 富文本框让最大四百像素_Django2.0.4 结合 KindEditor 4.1.11 富文本编辑器