数据库知识

1.MySQL 和 MongoDB 的区别有哪些?如何选择?

MySQL是关系型数据库。
优势:
  • 在不同的引擎上有不同 的存储方式。
  • 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
  • 开源数据库的份额在不断增加,mysql的份额页在持续增长。
缺点:
  • 在海量数据处理的时候效率会显著变慢。
Mongodb是非关系型数据库(nosql ),属于文档型数据库。文档是mongoDB中数据的基本单元,类似关系数据库的行,多个键值对有序地放置在一起便是文档,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自由的文档型数据库。
  • 存储方式:虚拟内存+持久化。
  • 查询语句:是独特的Mongodb的查询方式。
  • 适合场景:事件的记录,内容管理或者博客平台等等。
  • 架构特点:可以通过副本集,以及分片来实现高可用。
  • 数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
  • 成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
优点:
  • 快速!在适量级的内存的Mongodb的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。高扩展性,存储的数据格式是json格式!
缺点:
  • 不支持事务,而且开发文档不是很完全,完善。
当然,以下的情况选择MySQL会更好:
  • 需要复杂的多行事务的应用程序(例如双记录记录系统)
  • 涉及复杂交易的系统,比如旅行预订系统背后的预订引擎。
为什么交易系统更适合用关系型数据库?要回答这个问题,首先需要知道MySQL比MongoDB好的优点,在于Complex Transactions(复杂事务)。所谓事务,就是一组连续的DB操作。说白了就是一批SQL。事务处理主要用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务的应用场景,主要就是交易系统、订单系统、银行系统。

2.mongoDB优缺点:

优点:
1.弱一致性(最终一致),更能保证用户的访问速度:

举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的较精确值。这在某些情况下,例 如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“较精确”的保证几乎没有任何意义,反而会产生很大的延 迟。他们需要的是一个“大约”的数字以及更快的处理速度。

2.文档结构的存储方式,能够更便捷的获取数据

对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难。

3.内置GridFS,支持大容量的存储

GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。

4.性能优越

在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。

缺点:
1.mongodb不支持事务操作

所以事务要求严格的系统(如果银行系统)肯定不能用它。

2.MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。
3.mongodb占用空间过大

1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的较大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是较大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

3.事务

作为单个逻辑工作单元执行的一系列操作,满足四大特性:
  • 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;
  • 一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;
  • 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存。

4.事务的并发问题

  • 脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
    当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
    update account set money=money+100 where name=’B’;  (此时A通知B)
    update account set money=money - 100 where name=’A’;

当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

  • 不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
    例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  • 幻读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

5.数据库中的锁有哪几种

从数据库系统角度分为三种:排他锁、共享锁、更新锁。
从程序员角度分为两种:一种是悲观锁,一种乐观锁。
https://www.cnblogs.com/xuyuanjia/p/6027414.html

6.事务的隔离级别有哪几种
7.数据库的索引有什么作用?(必考) 底层数据结构是什么,为什么使用这种数据结构?

索引 是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;
底层数据结构是 B+ 树;
使用 B+ 树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。

B+树:
数据库知识_第1张图片
B+树

这里提一嘴:
B+树定义基本与B-树同,除了:

  • 非叶子结点的子树指针与关键字个数相同;
  • 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树
  • 为所有叶子结点增加一个链指针;
  • 所有关键字都在叶子结点出现;
    数据库知识_第2张图片
    B树

    关于b树以及b+树的具体定义,可以参考博客:https://blog.csdn.net/wyqwilliam/article/details/82935922
为什么使用b+树

参考博客:https://blog.csdn.net/weixin_30531261/article/details/79312676

8.聚簇索引和非聚簇索引的区别
  • 聚集索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
  • 非聚集索引。表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
9.MyISAM 和 InnoDB 的区别有哪些

MyISAM 不支持事务,InnoDB 是事务类型的存储引擎;
MyISAM 只支持表级锁,BDB 支持页级锁和表级锁,默认为页级锁;而 InnoDB 支持行级锁和表级锁,默认为行级锁;
MyISAM 引擎不支持外键,InnoDB 支持外键;
MyISAM 引擎的表在大量高并发的读写下会经常出现表损坏的情况;
对于 count( ) 查询来说 MyISAM 更有优势;
InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的;
MyISAM 支持全文索引(FULLTEXT),InnoDB 不支持;
MyISAM 引擎的表的查询、更新、插入的效率要比 InnoDB 高。

你可能感兴趣的:(数据库知识)