数据库索引及树(1)
关系型数据库
OLTP:
是传统的关系型数据库,主要操作增删改查,强调事务一致性,比如银行系统、电商系统。常见的
数据库:mysql,Oracle等。
OLAP:
是仓库型数据库,主要是读取数据,做复杂数据分析,侧重技术决策支持,
提供直观简单的结果。常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、
Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、
LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。目前主要了解 clickhouse
mysql 使用B+树索引;
mysql-数据都是存储在磁盘里,索引也是,当程序加载时,
会将索引缓存到内存里面,mysql默认的就是innodb引擎,(5.1之前好像不是)
在内存和磁盘数据交互时,一般情况下有一个最小逻辑单元,页,是4k或8k,每一个磁盘块大概是16kB
读写IO。如何优化?减少次数和每次的量
哈希表,通过hash算法找到对应key的hash值即可;存在hash冲突。数据散列,产生大量线性查询
树 --------二叉树- 红黑树 - B树 - B+树 - BST - AVL
二叉树
-
节点有序-算法二分查找-每一个节点有,且只有两个分支 如果其是一直递增或递减,
-
将会退化成链表,要避免的话,让树节点左旋或者右旋让树平衡 即 AVL树
AVL(平衡二叉树)
- 节点有序-最短子树跟最长子树高度只差不能超过1
相当于通过损失插入性能来弥补查询性能,但是如果读写请求一样多的时候怎么办?即红黑树
红黑树(平衡二叉树)
-
让树节点左旋或者右旋让树平衡 或变色的方式
-
最短子树跟最长子树高度不超过两倍即可-查询性能和插入性能取得一个近似平衡
随着数据的插入,树的深度会变深,意味则IO的次数会越来越多,影响读取效率
把原来有序的二叉树变成有序多叉树?但是原来的二插查找将不会是左小右大,将会是范围即B树
B树
- 递归分支查过4时, 即达到时向下分
B+树
- 加指针在B树的基础上扩容,在节点数据在同级中有序
- 和B树的区别如下,左图B树,右图B+树
以上图片来自百度百科和视频链接内容,如有问题可联系删除,谢谢
https://www.bilibili.com/video/BV1ov41137Vo?p=4