B+ 树查询性能比较稳定,在写入或更新时,会查找并定位到磁盘中的位置并进行原地操作,注意这里是随机 IO,并且大量的插入或删除还有可能触发页分裂和合并,写入性能一般,因此 B+ 树适合读多写少的场景。...和 B+ 树不同,在 LSM 中,数据的插入、更新、删除都会被记录成一条日志,然后追加写入到磁盘文件当中,这样所有的操作都是顺序 IO,因此 LSM 比较适用于写多读少的场景。...磁盘更新完了,再更新内存,内存当中可以选择一个简单的数据结构,比如哈希表。哈希表的 key 对应存放的是 Entry 在磁盘中的位置,便于查找时进行获取。...Merge 最后再来看一个比较重要的操作,前面说到,磁盘文件的记录是一直在追加写入的,这样会导致文件容量也一直在增加。...并且对于同一个 key,可能会在文件中存在多条 Entry(回想一下,更新或删除 key 内容也会追加记录),那么在数据文件当中,其实存在冗余的 Entry 数据。
LSM Tree 在磁盘上维护多级 SSTable 文件,在数据读取时,需要逐层扫描文件来查找指定的数据,最坏情况下需要扫描每一层的 SSTable,读性能不稳定。...B+ Tree 将数据维护在树最底层叶子节点中,读性能比较稳定,但是数据的插入和更新均是随机 IO 进行写入,导致 B+ Tree 的写性能相对较低。...Flush 的时候,数据索引信息会被存放到 B+ 树中,而 value 会被单独存放到 Value Log 中,value log 的结构类似于 WAL,数据写入都是采用日志追加,只不过 value log...否则说明 value 可能在磁盘中,就从 B+ 树获取 key 的索引信息,索引信息是一个二元组 ,标识 value 位于 value log 中具体哪个文件,以及文件中的位置...树,得益于 B+ 树稳定的读性能,整体的读取效率会更加可控 3、完全去除了 LSM Tree 模型中的多级 SSTable,没有了 SSTable 的维护,并且采用已有的 B+ 树实现(BoltDB)
列表和元组为何要总放在一起 列表和元组在基础篇已经好好的研究了基础用法,你应该保留一个基本印象就是列表和元组,就是一个可以放置任意数据类型的有序集合,或者当成一个容器也可以。...1.3 列表与元组的存储方式 运行下述代码查看运行结果,列表与元组元素数目保持一致。 my_list = ["a", "b", "c"] print(my_list....1.4 列表和元组的应用场景 简单来说,元组用在固定元素内容的数据上,列表用在可变的数据上,在希望记忆的简单一些,可以直接记成如果只需要 2、3 个元素,就使用 tuple,元素在多就使用 namedtuple...field_names:用于为创建的元组的每个元素命名,可以传入列表或者元组,例如 ['a', 'b'] 、(a,b),也可以传入'a b' 或 'a,b' 这种被逗号或空格分割的单字符串。...有了上述函数,你也可以测试一下相同的元素在列表与元组初始化的时候,哪个效率更好。
利用顺序IO: 这些技术是在磁性硬盘驱动器 (HDD) 时代发明的,顺序IO在HDD中远优于随机IO。但即使在SSD时代,顺序IO仍然相关。这些系统的追加式特性使其适合顺序IO。...在合并过程中,如果需要,可以消除重复项。 这个将级别i的T个有序运行合并以构建级别i+1的更长运行的过程会持续尽可能多的级别,其灵感来自外部排序合并算法。...然而,通过特定于该有序运行的索引(例如B+树)可以有效地查找有序运行中的键。这些B+树直接指向物理位置(而不是RID),因为位置保持不变。...有序运行显示为B+树以优化读取操作。请注意,叶级别表示有序运行,而上层级别是从叶级别自下而上构建的(批量加载B+树的标准方法)。在这方面,LSM树可以被认为是访问方法和面向记录的存储结构的组合。...读取 从单个B+树读取的少量随机IO 从多个B+树读取的许多随机IO 空间管理 需要管理块内的空闲空间 无块级空间管理 垃圾回收 不需要,因为被覆盖的记录会立即丢失 在级别之间合并期间定期清理 空间开销
存储空间使用: LSM树:LSM树可能会产生大量SSTable文件,这可能占用大量存储空间。合并操作可以减小存储空间的使用,但仍然需要管理存储空间。...B+树:B+树通常不会产生太多碎片数据,因此在存储空间上相对高效。 4....B+树:B+树不需要类似的合并操作,因为它们的结构不会导致数据碎片。 5. 使用场景的不同: LSM树:LSM树通常适用于写入密集的工作负载,如分布式数据库、日志存储和时间序列数据。...它们在需要频繁的范围查询时表现出色。 综上所述,LSM树和B+树在写入性能、读取性能、存储空间使用和合并操作等方面有明显的区别,因此在不同的使用场景中选择合适的数据结构非常重要。...根据工作负载的特点,可以选择LSM树来获得高写入性能,或选择B+树来获得高读取性能。 结论 LSM树是一种高性能的数据存储结构,通过优化写入操作,使其在众多应用场景中得以广泛应用。
LSM 树的这些特点,使得它相对于 B+ 树,在写入性能上有大幅提升。所以,许多 NoSQL 系统都使用 LSM 树作为检索引擎,而且还对 LSM 树进行了优化以提升检索性能。...# LSM 树是如何检索 因为同时存在 C0 和 C1 树,所以要查询一个 key 时,我们会先到 C0 树中查询。如果查询到了则直接返回;如过没有查询到,则查询 C1 树。...假设某数据在 C0 树中被删除了,但是在 C1 树中仍存在。这此时查询时,可以在 C1 树中查到这个 key,这其实是过期数据了,如何应对这种情况呢?...# 为什么需要 LSM 树 在关系型数据库中,通常使用 B+ 树作为索引。B+ 树的数据都存储在叶子节点中,而叶子节点一般都存储在磁盘中。...WAL 技术保存和恢复数据的具体步骤如下: 内存中的程序在处理数据时,会先将对数据的修改作为一条记录,顺序写入磁盘的 log 文件作为备份。
整型 a=10 b=0 b+=a c=-100 c-=a print (a, b ,c) print (dir(a)) print (abs(a)+abs(c)) print type(a) 浮点型 round...布尔型 True False print (not True) a = 10 b = 20 c = 100 print (not (a>b and c>a)) 字符串 a = 'abcdef' b =...name) print f g = ('my name is %s') % 'alex' print g print ('{name}:{age}'.format(name='alex',age=27)) 列表...a = ['a','b','c',1,'abc'] print a print type(a) print dir(a) 追加append a.append('hell0') print a 索引index...1) print a 排序sort a.sort() print a 反序reverse a.reverse() print a 切片 print (a[0:4]) print (a[1:3:2]) 元组
夯实Python基础 三、列表 在《Python入门》相关课程中,我们学习Python的四大数据结构:列表、元组、字典和集合。...1、列表可以包含任何种类的对象,甚至可以嵌套,一个列表中可以包含另一个列表作为其中一个对象。 2、列表包含的都是可变对象,支持实时修改(原处修改)。 3、列表可以根据需要增加,或减少。...(2)使用append()方法向列表的末尾追加新的项。 (3)使用del语句,通过索引删除指定下标的项。...(9)、list.extend(seq):在列表末尾追加另一个序列中的值。...请注意,当追加一个字符串序列时的情形: >>> [1,2,3].extend(‘xyz’) [1,2,3,’x’,’y’,’z’] (二)、案例应用 如下表,是某公司员工考核表 员工ID 工龄 薪级 出勤率
Python 编程语言 包含许多内置容器数据类型,例如列表、元组 和字典。可以将容器视为包含其他对象的的对象。...在大多数情况下,内置容器就足够了。但是,当你需要操作专门的数据结构时,你会希望使用 collections 模块。这些基本容器不需要导入。...在处理对象详细信息时,这非常方便。例如,假设你正在创建一个应用程序来添加学生详细信息,并且不想创建一个完整的类。为此,你可以使用 NamedTuple。...例如,你可能拥有: a = Camille b = Colette c = Aaron d = Clara 您可能希望在不更改 a、b、c、d 顺序的前提下更改其中一个名称。...Deque 双端队列非常有用,因为它允许您在集合的开头或结尾追加一个值。
"Unity", "Python"] ["a", "b", "c", "d"] 在一些 Python 教程中,经常用 list 代指列表,这是因为列表的数据类型就是 list,通过 type() 函数就可以知道...obj 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等。...示例如下: list1 = ['Python', 'C#', 'Java'] #追加元素 list1 .append('Unity') print(list1 ) #追加元组,整个元组被当成一个元素 t...示例如下: list1 = ['Python', 'C#', 'Java'] #追加元素 list1 .extend('Unity') print(list1 ) #追加元组,元祖被拆分成多个元素 t...,所以在使用 remove() 删除元素时最好提前判断一下,防止程序报错。
,它可以是单个元素,也可以是列表、元组等。...在列表的末尾追加元素。...在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。...extend() 和 append() 的不同之处在于:extend() 不会把列表或元组视为一个整体,而是把它们包含的元素逐个添加到列表中。...= [1, 2, [3, 10], 5, 6, 7] b = [1, 2, [3, 10], 5, 6] 可以看出,列表a中新增元素,对列表b没有影响;但是如果修改了a中的列表对象,同样也会影响到
通晓它们才能成为熟练的Python程序员。 元组 元组是一个固定长度,不可改变的Python序列对象。...' In [41]: b_list Out[41]: ['foo', 'peekaboo', 'baz'] 列表和元组的语义接近,在许多函数中可以交叉使用。...用extend追加元素,尤其是到一个大列表中,更为可取。...二分搜索和维护已排序的列表 bisect模块支持二分查找,和向已排序的列表插入值。...因此,对未排序的列表使用bisect不会产生错误,但结果不一定正确。
通常+号两侧的序列由相同类型的数据所构成,在拼接的过程中,两个被操作的序列都不会被修改,Python会新建一个包含同样类型数据的序列作为拼接的结果。...比如: a = [1] b = [2] c = a + b print(a, b, c) print(id(a), id(b), id(c)) 结果为: [1] [2] [1, 2] 2409610524480...a.t变成(1, 2, [30, 40, 50, 60]) b.因为tuple不支持对它的元素赋值,所以会抛出TypeError异常 c.以上两个都不是 d.a和b都是对的 因为元组不能赋值,所以我会毫不犹豫的选择...小结 本文分别介绍了+、*和列表套列表的陷阱,+=、*=和元组套列表的陷阱,并分别得出了教训。这是动态语言的弊端,在运行后才能知道有没有类型错误,只能积累代码经验来避免。...鱼与熊掌不可兼得,在享受Python语法简洁的便利同时,也得付出运行报错排查麻烦的代价。 参考资料: 《流畅的Python》
MySQL索引实现 MyISAM索引实现 数据与索引是分开存放(图一); 新增数据直接追加写数据文件,同时更新索引; B+树的叶子节点上存储的是数据的实际地址偏移; 主索引与辅助索引(图二)在数据结构上没有区别...InnoDB索引实现 数据文件是按B+树组织的一个索引结构文件(图三),这个数据文件的索引就是主Key。 这棵B+树的叶节点data域保存了完整的数据记录。...例如某列char(100),但大多数前10或20已经有足够的区分度就没必要为整个字符串列建立索引。原因还是出于磁盘I/O,缓存空间,匹配效率方面考虑。 5.在InnoDB中要用单调字段作为主键。...原因:InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。...那么可用索引为 A.国家 B.国家,省份 C.国家,省份,城市 但必须满足最左缀原理。如果查询条件里只有国家,城市就无法充分利用改符合索引。 4.不在like的开始部分使用通配符。
:支持随机读取 Hash table mysql 在指定索引的时候可以使用 B+Tree 或 HashTable。...这意味着当需要通过遍历获取存储在硬盘上的数据时候,需要更多次的I/O操作。硬盘读取时间远远超过数据在内存中比较的时间,这将导致程序大部分时间会阻塞在硬盘 I/O 上。...相较于B Tree, B+ Tree 的高度会更矮, 范围查询的时间也会稳定一些。...相比于数据读取场景,B+树在写多场景的性能并不理想。这主要原因是:B+树在插入和删除操作时,可能需要进行节点的分裂和合并,以保持树的平衡。...这会导致更新硬盘上多个数据页和Page Cache页缓存数据失效,这些操作伴随大量的随机I/O,限制B+树的写入效率。
不要在遍历列表时添加或删除项目 在用for或while循环遍历(即迭代)列表时,从列表中添加或删除项目很可能会导致 bug。...浪费一个程序员的时间远比浪费一台计算机的内存更昂贵。 ---- 尽管在遍历列表(或任何可迭代对象)时不应该添加或删除列表中的项目,但是修改列表的内容是很好的。...这样,您可以在遍历列表时从列表中删除项,或者向列表中添加项,只要将它们添加到列表的末尾。例如,输入下面的代码,它从someInts列表中删除偶数整数。...= b != c True 但这个链条其实相当于(a != b) and (b != c)。这意味着a仍然可以与c相同,并且a != b !...即使它们很少出现,也最好了解它们,这样您就可以快速识别和调试它们可能导致的问题。 尽管在遍历列表时可以添加或删除列表中的条目,但这是潜在的错误来源。
图片 0、前言 SQL优化调优是体现程序员分析归纳能力的有效手段,虽然我们不是DBA,但是编码开发时也会涉及许多对数据库的CRUD需求。...3、redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。...对于事务最重要的便是隔离级别了,但每种隔离级别都不是十全十美的,相对应的会引发匹配的问题,下面逐一解析。 3.1 读未提交 读未提交是指:一个事务还没提交时,它做的变更就能被别的事务看到。...可重复读: 在开始读取数据(事务开启)时,update操作可以被隔离 但是insert/delete操作除外,这会出现一个新问题(幻读)。解决幻读就需要锁表了。...在索引列上进行计算、函数、手动或自动的类型转换会导致索引失效;见下图: 图片 6.5 索引设计原则 第一个索引原则:尽量使用主键索引原则。
A. 0 B. 1 C. 2 D. -1 第8题:readlines()方法返回的是一个什么类型的数据? A. 字符串 B. 列表 C. 元组 D....程序会抛出FileNotFoundError异常 C. 程序会抛出IOError异常 D. 程序会继续执行,但文件内容为空 第16题:在Python中,哪个函数或方法用于检查文件是否存在?...第22题 file.writelines()方法可以接受一个列表或元组作为参数,并将列表或元组中的每个元素作为一行写入文件。...第8题:B. 列表 解析:readlines()方法读取文件的每一行,并将它们作为列表中的元素返回。 第9题:C. ‘a’ 解析:'a’模式用于在文件末尾追加内容。 第10题:A....当前工作目录是程序启动时所在的目录,或者是在程序运行过程中通过os.chdir()函数改变的目录。
思考一个问题,当这种数据结构在遇到更新数据(插入或删除)时,会怎样?...减少磁盘IO次数 B+树的数据结构模型将所有数据都放到叶子节点,且叶子节点形成一个列表(可以做范围查询),非叶子节点只放键值,这样每个数据叶中可存放的有效数据就多了,可以有效减少磁盘IO次数。...显然,使用索引速度会快。但是在写入数据的时候,需要维护这颗B+树的结构,因此写入性能会下降! 聚簇索引(主键索引)的叶子节点存储的是整行数据。...因此,我们在应用中应该尽量使用主键查询。 索引维护 因为B+树为了维护索引有序性,在插入新值或删除数据的时候需要做必要的维护。...当表是经常需要更新的不适合做索引,频繁更新会导致索引也会频繁更新,降低写的效率。
一、变量 变量:存储数据的容器,我们可以通过变量来操作数据 我们在创建变量时会在内存中开辟一个空间,可以存储不同类型的数据。...'浦东' a+b --> '上海浦东' a*3 --> '上海上海上海' a='上海';b='浦东';c='世纪大道' '上海-浦东-世纪大道' >>> a+'-'+b+'-'+c '上海-浦东-世纪大道...list 元组tuple 字典dict 集合set 列表:可变的有序序列,可以存储任意类型的数据 string='' tlist=[] >>> tlist=[1,3.14,True,1+2j,'python...(默认索引为-1),会返回删除的对象 >>> tlist=['a','b','c'] >>> tlist ['a', 'b', 'c'] >>> tlist.pop() 'c' >>> tlist ['...# 例如结果是print('小明的职业是程序员,目前22岁,在北京工作每个月能拿10000') print('%s的职业是%s,目前%s岁,在%s工作每个月能拿%s'%("小明","程序员",22,"北京
领取专属 10元无门槛券
手把手带您无忧上云