一.物理存储与读写瓶颈

1.磁盘(固态硬盘,机械硬盘)

(1)磁盘寻址:毫秒级别

(2)磁盘IO:百兆级别

(3)磁盘读写方式:顺序读写(慢),随机读写(快)

2.内存

(1)内存寻址:纳秒级别

二.解决思想

1.解决思想:因为全量IO很慢,所以分治。

2..具体解决方案

(1)关系型数据库

A.分成数据块(db2中叫datapage):有大小约束(4,8,16K的小格子),大的数据散在小格子里面,分治思想。

B.索引(解决数据全量扫描问题):如果只是数据分块(分治),必然会触发数据全量扫描,因为并不知道数据具体在哪个分块内。因此要正确建立索引。首先,每个索引记录多个分块,索引也是数据(即元数据:数据的数据),索引数据的总量比数据总量小,因此索引可以加快查询。然后,在内存里维护索引树B+(记录索引页),通过内存中建立的数据结构再一次加快(避免了索引的全量扫描)。

内存索引树->索引页->数据页

C.数据库存储数据结构化(有列,数据类型的概念):没有数据结构化的话只能通过偏移量/寻址读数据。

D.行级存储:每一行物理连续存储在一起。如果一行有空值,也占空间。

E.关系型

注:数据变大,增删改肯定变慢(破坏了原有索引),查询不一定(索引命中了不会变慢)。

(2)Nosql/Key-Value数据库:Reids,memecache

因为磁盘IO慢,所以解决方案:1.内存中建立关系数据库 2.redis(中间折中技术):完全使用内存存储数据,不会和磁盘有数据交换。频繁使用的数据(热数据)放在内存,不频繁使用的数据放在磁盘。

关系型数据库有数据库,因为数据完整性。Nosql数据库没有数据约束,数据不完整。

Redis的value有丰富的数据类型,每种类型有丰富的方法,计算好后直接返回,即:计算向数据移动。

注:Json可以表示单元素,数组,键值对。

注:数据向计算移动?计算向数据移动?

Redis是单进程,处理用户事务只有一个线程。单机。

Redis因为要持久化写,所以要多点。主从复制。

Redis作用:1.缓存2.数据库

注:单点:高可用;压力:

(3)HDFS,MapReduce

并发访问,分布式文件存储。