5.数据库章(Mysql、Mongodb、Redis)

1.Mysql

1.1mysql存储引擎

引擎查看:show engines


image.png

为什么有不同的引擎:
mysql中通过各种不同的技术引擎将数据存储在文件或内存中。这些技术使用不同的存储、索引、锁定方法 从而提供不同的功能和能力。通过选择不同的引擎 你能获得额外的速度或功能,从而改善你应用的整体功能。

如何更改引擎:
不同的表可以使用不同的引擎
默认引擎是innoDB。
1. 修改配置文件my.ini
2. 创建表的时候type指定
3. alter table type=InnoDB
查看修改:show table status from db; show create table table_name

引擎对比
常用到三个引擎:InnoDB、MyisAM、Memory
1.InnoDB(Mysql默认的引擎)
InnoDB是一个事务型的数据引擎、支持行级锁定和外键约束。
Innodb引擎提供了对数据库ACID事务的支持。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引(5.7已经支持),而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
适用场景:
1)经常更新的表,适合处理多重并发的更新请求。
2)支持事务。
3)可以从灾难中恢复(通过bin-log日志等)。
4)外键约束。只有他支持外键。
5)支持自动增加列属性auto_increment。

2. MyisAM
它不提供数据库对事务对支持、不支持行级锁和外键约束,因此在insert和update的时候会全表锁导致效率低一些。
MyisAM独立与操作系统,引擎在创建表的时候会创建三个文件,一个是.frm文件用于存储表的定义,一个是.MYD文件用于存储表的数据,另一个是.MYI文件,存储的是索引。操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。有索引管理和字段管理。MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间

适用场景

1)不支持事务的设计,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。
2)不支持外键的表设计。
3)查询速度很快,如果数据库insert和update的操作比较少的话比较适用。
4)整天 对表进行加锁的场景。
5)MyISAM极度强调快速读取操作。
6)MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。

缺点:
就是不能在表损坏后恢复数据。(是不能主动恢复)

3. Memory(也叫HEAP)堆内存
定义
使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。

但是一旦服务关闭,表中的数据就会丢失掉。 HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。

适用场景:
1)那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地堆中间结果进行分析并得到最终的统计结果。
2)目标数据比较小,而且非常频繁的进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。
3)数据是临时的,而且必须立即可用得到,那么就可以放在内存中。
4)存储在Memory表中的数据如果突然间丢失的话也没有太大的关系。

注意: Memory同时支持散列索引和B树索引,B树索引可以使用部分查询和通配查询,也可以使用<,>和>=等操作符方便数据挖掘,散列索引相等的比较快但是对于范围的比较慢很多。

特性要求:
1)要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。
2)要记住,在用完表格之后就删除表格。

https://blog.csdn.net/Jack__Frost/article/details/72904318

索引

索引:索引是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引。

MySQL普遍使用B+tree实现其索引结构,B+tree是B-tree的一个变种,B是balance,使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度

B+tree.png

InnoDB索引:叶子节点存储的是数据data
image.png

MyISAM索引:叶子节点存储是数据的地址

image.png

Hash索引
通过hash函数将索引列值映射到对应码值,索引存储的是数据地址

Hash.png

如果多个列的哈希值相同(hash冲突),索引会以链表的方式存放多个记录指针到同一个哈希条目中去。

全文索引(fulltext)
通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计,全文索引在大量的数据面前,能比 like + % 快 N 倍
MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

全文索引场景
和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如
select * from fulltext_test
where match(content,tag) against('xxx xxx');

1)使用全文索引前,搞清楚版本支持情况;
2)全文索引比 like + % 快 N 倍,但是可能存在精度问题(?);
3)如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
4)对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。

2.Mongodb和mysql对比

比较类别 MongoDB Mysql
数据库模型 非关系型 关系型
存储方式 虚拟内存+磁盘持久化 磁盘
架构特点 副本集分片实现高可用 单点、主从、集群等
数据处理 基于内存、将热点数据存在物理内存中实现高速读写 不同引擎有不同特点
成熟度 新兴数据库成熟度较低 成熟体系
广泛度 完善开源使用越来越广 开源数据库使用越来越广
事务性 仅支持单文档事务操作,弱一致性 支持事务操作

一、关系型数据库-MySQL
1、在不同的引擎上有不同的存储方式。
2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3、开源数据库的份额在不断增加,mysql的份额页在持续增长。
4、缺点就是在海量数据处理的时候效率会显著变慢。

二、非关系型数据库-MongoDB
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。

1、存储方式:虚拟内存+持久化。
2、查询语句:是独特的MongoDB的查询方式。
3、适合场景:事件的记录,内容管理或者博客平台等等。
4、架构特点:可以通过副本集,以及分片来实现高可用。
5、数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6、成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。

Mongodb优势:

  1. 快速 :热点数据存储在物理内存中,使读写非常快速从而提高了整体性能
  2. 高扩展性:MongoDB高可用与集群框架拥有十分高的扩展性,通过物理机的增加以及sharding增加,MongoDB的扩展达到十分惊人的底部
  3. 自身的failover机制:mongoDB的副本集配置中,当主库遇到问题,无法继续提供服务时,副本集将选举一个新的主库来继续提供服务
  4. json的存储格式,json与bson存储格式十分适合文档格式的存储与查询

劣势:
1、 不支持事务操作(4.0开始已经支持)。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
2、 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
3、MongoDB占用空间过大。

mongo基础:
https://www.cnblogs.com/clsn/p/8214194.html#auto-id-14

MongoDB水平扩展:
https://www.infoq.cn/article/scale-out-mongodb

你可能感兴趣的:(5.数据库章(Mysql、Mongodb、Redis))