BTree

LSM-tree 基本原理及应用

安稳与你 提交于 2019-11-30 10:35:30
LSM-tree 在 NoSQL 系统里非常常见,基本已经成为必选方案了。今天介绍一下 LSM-tree 的主要思想,再举一个 LevelDB 的例子。 正文 3056 字,预计阅读时间 8 分钟。 LSM-tree 起源于 1996 年的一篇论文《The Log-Structured Merge-Tree (LSM-Tree)》,这篇论文 32 页,我一直没读,对 LSM 的学习基本都来自顶会论文的背景知识以及开源系统文档。今天的内容和图片主要来源于 FAST'16 的《WiscKey: Separating Keys from Values in SSD-conscious Storage》。 先看名字,log-structured,日志结构的,日志是软件系统打出来的,就跟人写日记一样,一页一页往下写,而且系统写日志不会写错,所以不需要更改,只需要在后边追加就好了。各种数据库的写前日志也是追加型的,因此日志结构的基本就指代追加。注意他还是个 “Merge-tree”,也就是“合并-树”,合并就是把多个合成一个。 好,不扯淡了,说正文了。 LSM-tree 是专门为 key-value 存储系统设计的,key-value 类型的存储系统最主要的就两个个功能,put(k,v):写入一个(k,v),get(k):给定一个 k 查找 v。 LSM-tree 最大的特点就是写入速度快

B+Tree索引原理

拜拜、爱过 提交于 2019-11-30 06:36:26
什么是索引? 索引是一种数据结构,具体表现在查找算法上。 索引目的 提高查询效率 【类比字典和借书】 如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。 去图书馆借书也是一样,如果你要借某一本书,一定是先找到对应的分类科目,再找到对应的编号,这是生活中活生生的例子,通用索引,可以加快查询速度,快速定位。 数据结构——树 树 二叉树 每个节点最多含有两个子树的树称为二叉树。 二叉查找树ADT Tree 左子树的键值小于根的键值,右子树的键值大于根的键值。 平衡二叉树AVL Tree 在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。 BTree BTree也称为平衡多路查找树 B-Tree是为磁盘等外存储设备设计的一种平衡查找树。 B+Tree B+Tree是在B-Tree基础上的一种优化 非叶子结点只存储键值信息,不存储数据 所有的叶子结点都有一个链指针 数据记录都存放在叶子结点中 MySQL默认使用B+Tree索引 索引本身也很大,所以存储在磁盘中,需要加载到内存中执行。 故: 索引结构优劣标准:磁盘I/O次数 BTree是为了充分利用磁盘预读功能而创建出来的一种数据结构。 局部性原理和磁盘预读 局部性原理:当一个数据被用到

MySQL中的哈希索引

▼魔方 西西 提交于 2019-11-30 06:35:20
Memory中的哈希索引 哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存贮在索引中,同时在哈希表中保存指向每个数据行的指针。 在MySQL中只 有Memory 引擎显式支持哈希索引。这也是 Memory 引擎表的默认索引类型。 Memory 引擎支持非唯一索引,这在数据库世界里是比较与众不同的。如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希列表中。 创建一个使用hash索引的表, CREATE TABLE testhash ( fname VARCHAR(50) NOT NULL, lname VARCHAR(50) NOT NULL, KEY USING HASH(fname) ) ENGINE=MEMORY; 用下式查询, mysql> SELECT lname FROM testhash WHERE fname='Peter'; mysql先计算“Peter”的哈希值,并使用该值寻找对应的记录指针。找到指针指向的行后,比较fname是否为“Peter”,以确保是查找的行。 因为索引自身只需存贮对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 然而也有局限,懒得敲字了

或许你不知道的10条SQL技巧

为君一笑 提交于 2019-11-30 06:08:29
这几天在写索引,想到一些有意思的TIPS,希望大家有收获。 一、一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 可以优化为in查询: select * from order where status in(2,3) (2)前导模糊查询不能使用索引 select * from order where desc like '%XX' 而非前导模糊查询则可以: select * from order where desc like 'XX%' (3)数据区分度不大的字段不宜使用索引 select * from user where sex=1 原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。 经验上,能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。 (4)在属性上进行计算不能命中索引 select * from order where YEAR(date) < = '2017' 即使date上建立了索引,也会全表扫描,可优化为值计算: select * from order where date < = CURDATE() 或者: select *

MySQL中的B-Tree索引

不问归期 提交于 2019-11-30 05:54:10
索引类型 在MySQL中,索引是在存储引擎层而不是服务器层实现的,故而没有统一的引擎标准:即同一种索引在不同存储器上的实现可能不一样。 B-Tree索引: 当人们谈论索引的时候,如果没有特别指出,多半讲的就是B-Tree索引。B-Tree意味着所有的值都是按顺序存储的,并且每一个叶子到根的距离相同。下图表反应了InnoDB的B-tree索引如何工作。 假如有以下表: CREATE TABLE People ( last_name varchar(50) not null, first_name varchar(50) not null, dob date not null, gender enum('m', 'f') not null, key(last_name, first_name, dob) ); 对于表中的每条数据,索引如下 索引对多个值进行排序的依据是create table语句中定义索引时列的顺序。 B-Tree通常可以支持“只访问索引查询”,无需访问数据行。 因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的order by操作。 T-Tree索引的限制: 如果不是按照索引的最左列开始查找,则无法使用索引。如上表中不能查找特定生日的人。 不能跳过索引中的列。如果不指定first_name,则MySQL只能使用索引的第一列。

程序员的算法课(16)-B+树在数据库索引中的作用

感情迁移 提交于 2019-11-29 16:00:29
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/m0_37609579/article/details/100107832 前文讲了二叉树和多路树,二叉树的性能很好,像AVL树、红黑树都是很优秀的结构,那么在数据库索引中,并没有采用二叉树这种结构,这是为什么呢?因为,有性能更好的树来做搜索!目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。 一、B-树和B+树回顾 1.B-树 B-tree (多路搜索树)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。 B-树每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。 B-树的特征: 根节点至少有两个孩子 每个非根节点有[ ,M]个孩; 每个非根节点有[ -1,M-1]个关键字,并且以升序排列 key[i]和key[i+1]之间的孩子节点的值介于key[i]、key[i+1]之间 所有的叶子节点都在同一层 B-树的优势: B树的优势在于多路查找,这便是优于红黑树的具体原因,大家想一想,B-树每个结点有多个key

PostgreSQL环境下,触发器、索引和角色的创建

做~自己de王妃 提交于 2019-11-29 10:16:17
创建表触发器的SQL语句 CREATE TRIGGER example_trigger BEFORE INSERT ON teaches FOR EACH ROW EXECUTE PROCEDURE example_function(); 实例 : 首先创建测试表、视图 CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); CREATE TABLE AUDIT_HIS( EMP_ID INT NOT NULL, EMP_NAME TEXT NOT NULL, ENTRY_DATE TEXT NOT NULL ); CREATE TABLE AUDIT( EMP_ID INT NOT NULL, EMP_NAME TEXT NOT NULL, ENTRY_DATE TEXT NOT NULL ); CREATE OR REPLACE VIEW "public"."company_view" AS SELECT company.id,company.name,company.age 2.创建触发器函数 CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS

PostgreSQL环境下,触发器和索引的创建

左心房为你撑大大i 提交于 2019-11-29 09:53:25
创建表触发器的SQL语句 CREATE TRIGGER example_trigger BEFORE INSERT ON teaches FOR EACH ROW EXECUTE PROCEDURE example_function(); 实例 : 首先创建测试表、视图 CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); CREATE TABLE AUDIT_HIS( EMP_ID INT NOT NULL, EMP_NAME TEXT NOT NULL, ENTRY_DATE TEXT NOT NULL ); CREATE TABLE AUDIT( EMP_ID INT NOT NULL, EMP_NAME TEXT NOT NULL, ENTRY_DATE TEXT NOT NULL ); CREATE OR REPLACE VIEW "public"."company_view" AS SELECT company.id,company.name,company.age 2.创建触发器函数 CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS

mysql 索引

孤街浪徒 提交于 2019-11-29 09:37:41
记录一些关于mysql的实践信息 索引类型分为:FULLTEXT、NORMAL、SPATIAL、UNIQUE 索引方法:BTREE、HASH FULLTEXT:全文索引,只针对英文有效,提升使用like %xxx%检索效率 NORMAL:一般索引, SPATIAL:空间索引,使用RTREE的方式,存储几何二进制大数据搜索。 组合索引:就是多个字段组成一个索引叫组合索引,需要注意组合索引有最左优先算法,比如(A,B,C)查询条件中(A)、(A,B)、(A,B,C)会使用索引,(B)、(C)、(B,C)的查询都不会使用索引。同时使用组合索引时,需要注意select后面的字段会影响是否走索引,需要多用EXPLAIN来检查查询情况,尤其是带有OR的查询语句。 组合索引中限制条件比较多,得多检查下索引使用情况。 来源: https://my.oschina.net/uwith/blog/3105365

工作中遇到的99%SQL优化,这里都能给你解决方案(二)

我是研究僧i 提交于 2019-11-29 08:56:10
-- 示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位', `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间', PRIMARY KEY (`id`), KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE, KEY `idx_age` (`age`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=136326 DEFAULT CHARSET=utf8 COMMENT='员工表' Order by与Group by优化 EXPLAIN select * from employees WHERE name='LiLei' and