程序员中一直有一个段子广为流传:大不了我们“删库跑路”

由此可见作为一个程序员,不了解数据库怎么能行,那么数据库到底是个啥呢,作为一个Java工程师,平时和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。

根据百度百科的介绍,数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。

数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

是不是没听懂,好吧,简单来说,像MySQL这样的数据库,就是用于存储结构化数据的,比如一个学生的信息数据,一个商品的数据,或者是一个学生购买商品的消费数据。

联想到平时我们经常使用的Excel,其实和数据库挺像的,数据库其实就是一个表格,里面有很多的数据类型,比如字符串,比如数字,再比如长文本等等。

而这类数据库也叫关系型数据库,典型代表就是MySQL。

再看看百度百科的介绍,关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

除了关系型数据库之外,近些年来还有很多nosql(not only sql)数据库在兴起,比如MongoDB,以及图数据库、列式数据库等等,这些数据库对于新手程序员来说用的并不多,所以本文我们只讨论关于关系型数据库的内容。

关系型数据库是我们程序员平时用的最多,也最简单易上手的数据库类型,所以,学习数据库一般也从MySQL这类关系型数据库入手,一来它简单好学,二来它是免费的。

学习数据库,先从SQL入手

说到MySQL,就不得不谈谈SQL了,sql,按照百科的说法是这样的

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

对于不同的数据库,sql的写法可能有一些差异,但是大致都是相同的,就拿MySQL来说,平时我们用到最多的就是select、update、delete和insert了,这类操作统称为数据操纵语言DML(Data Manipulation Language),用户通过它可以实现对数据库的基本操作。

当然还有操作数据库和表的一些ddl,数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言。 简单来说,ddl其实就是用来执行建表,删表,更改表结构等操作的

以前我的sql写的并不多,毕竟简单的增删改查并不需要多复杂的sql技巧,最多就是做一下表连接。

再到后来,我开始做一些项目,接触了ORM的一些框架,比如hibernate和mybatis,这些框架甚至可以让你完全不写sql,只要调用一些增删改查的API即可,这让我很长一段时间都忽略了SQL的重要性。

其实学习sql最复杂的地方并不是一些高级用法,而是在于实际场景中的应用和优化。两条sql,可能因为简单的差异就会有很大的性能差距,差异点可能是,比如有没有走到索引,是否是全表扫描,又或者走到了哪个索引,而这样的性能分析只有在实际的场景里才有意义。

当然了,对于新手来说,学习sql的语法是放在第一位的,然后才能逐渐过渡到会使用,会优化,会分析。

数据库基本原理

学习数据库,你需要先打好基础,数据库原理是计算机科班的一门必修课,非科班的我选择的是自学,我当时也是拿着那本大学教材《数据库系统概论》来自学的。

教材这种东西,肯定还是偏理论的一点,我们要了解的内容主要包含几个方面

1、数据库模型有哪些:包括层次模型、网状模型和关系模型,我们所用的关系型数据库就是基于关系模型实现的。

2、关系数据库的基础和sql:了解关系数据库的基本概念,了解sql的基本使用方法,至少CRUD和一些常见用法要搞懂

3、数据库的安全性和完整性,这两部分内容其实理论的东西比较枯燥,实际上对应到实际场景中,安全性就是要保护数据的安全,包括权限控制和数据备份,而完整性则是通过一些约定和规范来限制数据库的存储内容,比如我们可以用主键、唯一键、非空等要求来限制字段的取值。

4、关系数据理论 这部分内容很有意思,也比较复杂,讲到了数据库的范式理论,从一范式到四范式,各有各的用法和要求,某互联网公司“第四范式”就是用这个概念来命名的。

5、事务和锁 最后一部分内容,就是数据库的两个重要组成部分,事务和锁,事务可以保证一组数据库操作的ACID特性,非常适用于需要数据一致性的场景,而数据库的锁不但是实现事务的基础,还可以灵活地适用于不同的数据库应用场景,我们还可以通过sql语句来完成加锁和释放,对于并发场景尤其管用。

MySQL的实现原理

学习完了数据库基础之后,接下来就该学习MySQL了,毕竟很多时候我们的数据库应用就是MySQL。

其实MySQL里的很多知识点和我们上面提到的数据库基础大同小异,而回到MySQL的实现层,我们就得来看看MySQL的存储引擎了。

MySQL的存储引擎分为innodb和myisam,相信大家对于这两个引擎区别的面试题看了也不少,比如innodb支持事务,支持行级锁,而myisam不支持。

由于现在innodb基本上是主流,所以我们讨论MySQL的时候基本上就是在讨论innodb。对于MySQL的实现原理,我认为大概有这么一些内容需要我们去学习。

首先,我们了解MySQL里有哪些数据类型,一般的用法如何,然后,尝试用MySQL去跑一些sql语句,建库建表,加索引加主键,总之,这些实践能帮助你更好地学习上述内容。

想要更好地了解MySQL的原理,我们就必须要了解MySQL的整体架构

客户端

也就是我们经常用的可视化工具,比如Navicat for MySQL

服务端

就是我们安装的MySQL程序,其实打开它它就是一个MySQL的服务端进程

sql执行层

sql执行层主要负责解析执行sql,里面包含了很多复杂的组成部分,比如解释器,分析器,优化器等等,执行层会生成一个sql的执行计划,这个计划也经常是我们分析sql性能的一个重要参考内容

存储引擎层

存储引擎层是innodb了,比如数据要如组织和存放,索引要如何建立和管理等等,加锁怎么加,事务如何实现,都是这一层要考虑的内容。

文件系统层

存储引擎的下一层就是文件系统了,数据库的数据如何和文件系统进行交互,就是这一层要做的事情了。

索引

不得不说,索引绝对是数据库中最经常考察,考点也最多的内容了。

比如给你一条sql,那么它能否命中索引,能命中哪些索引,如果想要命中某个索引,你应该如何修改,这种问题面试时是不是经常看到,变来变去这么多题型,其实面试官就是想考察你对于索引的理解。

还有就是,索引的数据结构,一样是非常热门的考点之一,索引其实是基于B+树来实现的,不知道b+树是啥,请回去看数据结构。

简单来说,它是一种多路搜索树,致力于更短的时间来完成数据检索,因为它的高度比二叉树要低,而比起普通的b树,它的非叶节点只起索引作用,而叶子节点是顺序串联的,所以非常适合做搜索树。

如果你理解了这一点,那么面对此类面试题就可以更加从容一些,面试官其实就是想知道你对b+树的了解到了什么样的程度而已。

事务和锁

除了索引之外,数据库中最复杂的内容可能就是事务和锁了。

就拿事务的ACID特性来说,你需要了解每个大写字母背后的实现原理,比如原子性是如何实现的,一致性是如何保证的,背后的原理是什么。

我们平时常用的事务可能就是spring里的事务模板,在事务里执行的同库数据库操作,要么都成功,要么都失败,这就是原子性。

两个事务之间互不影响,这就是隔离性,当然了,这里又涉及到了事务隔离级别。

事务隔离级别包括读未提交,读已提交,可重复读和序列化,每个事务隔离级别都适用于某种数据库读写场景,很多时候,我们都需要搞懂隔离级别背后的原理,才能更好地适用它。

MySQL里默认使用可重复读的隔离级别,这个级别基本上可以保证我们的事务按照预期执行,在MySQL中,这个事务隔离级别甚至可以解决幻读的问题。

在MySQL的事务背后,其实有一个隐藏的boss,那就是数据库的锁,很多事务的隔离级别都是通过锁来实现的,比如可重复读只要加行锁就可以实现了,而幻读则需要加上间隙锁next-key lock来实现。

行级锁和表级锁是MySQL中的两种锁,表级锁顾名思义,会直接锁表,一次只有一个事务能够访问,而行级锁其实锁的也并非是一行,在MySQL中,这个锁加在索引上,而这个索引对应的数据往往不止一行,所以这个行级锁只是理论意义上的"行级锁"

数据库事务的四原则

数据库事务ACID四大原则:

A代表Atomicity,即原子性。

C表示Consistency,即一致性。

I表示Isolation,即隔离性。

D表示Durability,即持久性。

这四个原则了解过数据库的应该都如雷贯耳。可是真正面试的时候被问起来,能一个不落说得上来,并且讲得清楚原委的就不多了。我觉得主要是因为我们的翻译过于文雅,不像英文那么直观,所以很难顾名思义。另一个原因是我们在学习的时候理解不够深入,只知道原因,不知道原因的究竟。所谓知其然,不知其所以然。

最后摆上学习资料

以上内容都是我自己的一些感想,分享出来欢迎大家指正,顺便求一波关注

SQL数据库不用SQL语句能显示全表的内容_2020别再说你了解数据库了,你搞清楚这些问题了吗?...相关推荐

  1. SQL数据库不用SQL语句能显示全表的内容_MySQL DBA必读:万字归总表设计与SQL编写技巧...

    作者介绍 刘书浩,"移动云"DBA,负责"移动云"业务系统的数据库运维.标准化等工作:擅长MySQL技术领域,熟悉MySQL复制结构.Cluster架构及运维优 ...

  2. SQL数据库不用SQL语句能显示全表的内容_阿里巴巴数据库分库分表的实践

    在2006年阿里巴巴B2B团队以开源方式研发了Cobar这一关系型数据的分布式处理系统.该系统在很大程度上解决了最初使用Oracle数据库因为存储数据变得越来越大带来的扩展性问题,并且为开发人员提供了 ...

  3. SQL数据库不用SQL语句能显示全表的内容_详解mysql数据库sql优化技巧总结

    概述 关于SQL优化的教程很多,但是比较杂乱.所以抽空整理了一下,也写出来跟大家分享一下.以下主要针对MySQL数据库,Oracle数据库也可以参考. 优化技巧总结 1.建索引 对查询进行优化,要尽量 ...

  4. SQL数据库不用SQL语句能显示全表的内容_MySQL百万级数据库优化方案

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  5. SQL数据库不用SQL语句能显示全表的内容_100道MySQL数据库经典面试题解析

    1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效 如何字段类型是字符串, ...

  6. SQL数据库不用SQL语句能显示全表的内容_Sql性能优化看这一篇就够了

    前言 一个优秀开发的必备技能:性能优化,包括:JVM调优.缓存.Sql性能优化等.本文主要讲基于Mysql的sql性能优化. 知识储备 首先我们需要了解执行一条查询SQL时Mysql的处理过程: ​其 ...

  7. SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据

    SQL Server 常用更新语句,用B表数据作为条件或数据源更新A表数据 示例:用B表姓名覆盖A表姓名 假设: A表数据 Id,Name 1,张三 B表数据 Id,Name 1,李四 用下面这个语句 ...

  8. Bootstrap Table 双击、单击行获取该行内容及获取全表的内容

    Bootstrap Table 获取单击或双击的行内容 看到这个应该就知道了bootstrap table的用法及如何使用了,所以下面的名称就不介绍了 test_id为表的id $("#te ...

  9. 哪些SQL语句会引起全表扫描

    大家都知道,用SQL语句对数据库进行操作时,如果引起全表扫描会对数据库的性能形成影响,下面简单介绍下SQL中哪些情况会引起全表扫描. 1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避 ...

最新文章

  1. Unreal Engine* 4.19 的 CPU 功能检测
  2. nfc pm3 模拟加密门禁卡_华为手机NFC的妙用,模拟门禁卡、公交卡、银行卡,电子证件等...
  3. 电脑版java运行条件,Java Runtime Environment电脑版-Java Runtime Environment(Java运行环境)8.0.221 x64正式版-蜻蜓手游网...
  4. python3项目-Python3基础教程(十九)—— 项目结构
  5. wince支持多线程编程吗_以前面试只问多线程,现在都开始问响应式编程了!我懵了...
  6. 多层 UIScrollView 嵌套滚动解决方案
  7. 基于深度学习的CTR模型DeepCTR 更新啦!
  8. 图解排序算法(四)之归并排序
  9. windows下配置caffe-matlab接口
  10. 56 FI配置-财务会计-固定资产-资产数据传输-定义历史数据传输的抵销科目
  11. CentOS通过yum安装高版本gcc
  12. 基于visual Studio2013解决面试题之1201链表去重
  13. oracle说不能初始化失败,PLSQLDeveloper 提示不能初始化?
  14. 小时光扫地机器人圆圆_小时光:圆圆录像功能已开启,无死角录制林一霸道总裁一面,超甜...
  15. 博文视点读书节第五日丨IT大咖私房书单继续放送,超级会员返场来袭!
  16. pycharm pip安装_Python从入门到大师教程 | 一、搭建Python环境和安装Pycharm
  17. python -m的作用
  18. OD脱壳-再次载入-软件无法找到入口
  19. 打印机服务器显示未连接,解决win10打印机提示“无法连接打印机 后台处理程序未运行”的方法...
  20. 帆软内置数据集实现决策报表联动

热门文章

  1. 安装ubuntu18.04虚拟机太慢
  2. matlab使用tic 和 toc记录程序执行时间
  3. 一文搞懂Python知识难点------装饰器
  4. Eclipse JAVA项目的 目录结构 和 导入 import菜单使用
  5. 保险条款精解(四)索赔——不可不看,因为您以前可能没听说过
  6. sobel prewitt算法 模板加权模糊的解释 + 两类边缘下的二阶导数值
  7. ReportViewer教程(5)-将数据源字段放入报表
  8. LINQ学习中需要明确的几点问题
  9. Entity Framework在三层架构中的使用
  10. 基于LINQ to SQL的WEB开发三层架构(2)