数据库基础: SQL, NoSQL, index

为什么要建index

硬盘的读取时间实在太慢了。10ms的量级。
提供一种额外的access方式。
secondary access path. Efficient access based on indexing fields
通过index field把它变成有序的。这样可以用二分法查找, 还可以检查constraint。
Index要有index field, 通过index field变成有序的

Primary Index

就是用文件的ordering key做为index。可以是sparse index

Clustering Index

用文件的ordering field 做为index. 可以是sparse index.
如果file record不是按 key排列的,则对于同一个clustering field可能会有好几个值。所以叫clustering index
仍然是sparse index

Secondary index

用记录的candidate key创建,是dense index. Search key 有一个不同的order from sequential order of file。
也可以是clustering index
问题是只能是dense index不能是sparse index.

composite index

index 不一定是只有一个field, 可以有好几个field。
要看查询是什么样子的。

怎么建index

根据use case,看怎么查

B Tree, B+ Tree

BTree, 对于一个degree 为p的 BTree, 它的internal node有p/2 到p个的点. 一旦多于这个点,则立马在上级节点加一个新的节点,同时split. 一时小于p/2, 则立马和旁边的merge。可能是一个recursive的过程一直到root.

uuid

128bit, 128/8 = 16 byte, Universally unique identifier
肯定不会重复,或者重复几率小到可以忽略。

SQL Vs No SQL

  1. 大多数情况下两者都可以。
  2. SQL型数据库关系性数据库,结构化的。对应到OO中的一个class。 NoSQL可以有动态的schema
  3. SQL功能强大,但速度慢, 更成熟,帮你做了很多事情比如serialization, secondary index
  4. NoSQL速度快,但很多功能需要程序员亲历亲为, serialization, secondary index。
  5. SQL的分布式需要程序员亲自去做,SQL自身不带sharding,天生不是分布式的,分布式需要自己去实现; NoSQL天生支持分布式
  6. 需要Transaction的话最好选SQL, 天生支持

速度的比较
MySQL/PosgreSQL 〜1k QPS

NoSQL, not only SQL, 经常来说很多数据库的操作需要自己写,但是基本都是天生分布式的。比如Serialization, Secondary Index
NoSQL常见的有Redis, MangoDB, MemCached(不支持数据持久化), Canssandra.
No SQL一般比较快。
MongoDB/Cassandra ~10kQPS 硬盘型No SQL
Redis/Memcached 100k ~1MQPS 内存型的NoSQL, (Redis读写操作都很快, cache thru型),
memcached + mySql 是cache aside, 读的快,写的慢
就是简单的key value pair
NoSQL性能比较高

Redis: 内存的访问速度, 又可以把数据持久化,小型网站喜欢redis。 需要的数据类型比较简单
Redis一种Cache thru的数据库: Memory和disk的打包.
https://www.cnblogs.com/vajoy/p/5471308.html
http://systemdesigns.blogspot.com/2016/01/cassandra-vs-dynamo.html

数据库又分cache aside和Cache through。
Web server <-> cache <->DB

Cache aside比如memcached, client需要自己管理cache miss时的数据
web server -> DB
\
V
Cache
业界常用cache aside

Write back cache vs Write thru cache vs write around
https://shahriar.svbtle.com/Understanding-writethrough-writearound-and-writeback-caching-with-python

NoSQL 的几种形式

Document based
Monga DB
Key Value pair:
Dynamo, Redis, memcached;
LevelDB是单机版的key value store
Columnar:
Bigtable, Hbase, Canssandra
Graph

Couch DB,
Elastic Search

CAP

Consistency, Availability, Partition tolerance
Consistency, Availability, Partition tolerance不能同时满足。 对于分布式操作系统来说, 肯定要满足Partition tolerance, 所以就是在Consistency, Availability 里面二选一。
一般Consistency可以放松,叫eventual consistency. 对于大公司,Availability一定要好, partition tolerance一定要好
,所以经常要牺牲consistency了。

ACID

Atomicity, Consistency, Isolation, Durability
什么是transaction?? 必须同时成功或同时失败. 需要支持transaction的 不能选NoSQL
对于一个transaction来说, 它一定要是最小的不可分的。这个transaction之前之后数据库的状态都应该是consistent的。对于那些可以同时执行的transactions来说,每一个transaction 都不依赖于其他的transaction. Durability 数据要能持久化。

你可能感兴趣的:(数据库基础: SQL, NoSQL, index)