二叉查找树是最常用二叉树,支持快速插入、删除、查找,时间复杂度跟高度成正比,理想时间复杂度是O(logn)。二叉查找树在频繁动态更新过程中,可能会出现$树高度>>log2n$的情况,导致各个操作的效率下降。极端退化为链表,时间复杂度O(n)。要解决这个复杂度退化的问题,要设计一种平衡二叉查找树。什么是“平衡二叉查找树”?二叉树中任意一个节点的左右子树的高度相差不能大于1。完全二叉树、满
有人删了千万级的数据,结果导致频繁的慢查询。线上收到大量慢查询告警,于是检查慢查询的SQL,发现不是啥复杂SQL,这些SQL主要针对一个表,基本都是单行查询,看起来应该不会有慢查询。这种SQL基本上都是直接根据索引查找出来的,性能应该极高。是否可能慢查询不是SQL问题,而是MySQL生产服务器的问题?特殊情况下,MySQL出现慢查询还真不是SQL问题,而是他自己生产服务器的负载太高,导致SQL语句
在一个主备关系中,每个备库接收主库的binlog并执行。正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确执行,备库就能达到跟主库一致的状态,这就是最终一致性。但MySQL要提供高可用能力,只有最终一致性还不够。为什么呢?MySQL主备切换流程--双M结构 主备延迟主备切换可能是:主动运维动作 比如软件升级、主库所在机器按计划下线等被动操作 比如主库所在机器掉电。同步
0相关源码1 技术选型 爬虫能做什么1.1 scrapy VS requests + beautifulsoup做爬虫的时
1 数据集简介MovieLens数据集是一个关于电影评分的数据集,里面包含了从IMDB, The Movie DataBase上面得到的用户对电影的评分信息,详细请看下面的介绍。1 links.csv文件里面的内容是帮助你如何通过网站id在对应网站上找到对应的电影链接的。1
相关源码搭建scrapy的开发环境,本文介绍scrapy的常用命令以及工程目录结构分析,本文中也会详细的讲解xpath和css选择器的使用。然后通过scrapy提供的spider完成所有文章的爬取。然后详细讲解item以及item loader方式完成具体字段的提取后使用scrapy提供的pipeline分别将数据保存到json文件以及mysql数据
没错,玩自动化测试时,又报错了。日常测试中,经常会使用py的 set 和 dict,set 是用 dict 实现,因为本身 dict 的 key 就是会被去重,value 设置为 None 即可作为 set 使用。Python 中的 dict 内部使用了哈希表的方式实现,所以对于 key 的要求就是需要计算哈希值。在 Python 的类型体系中,有些类型是支持计算哈希值,有些并不支持。
当我尝试运行以下代码,来练习使用json.loads()和json.dumps()函数时,系统给我报出了这个错误。import jsondata = {"a":1,"b":2,"c":3}j = json.loads(data)print(j)TypeError: the JSON object must be str, bytes or
MySQL会丢数据吗?在业务高峰期临时提升性能的方法。WAL机制保证只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。binlog的写入机制事务执行过程中:先把日志写到binlog cache事务提交时,再把binlog cache写到binlog文件一个事务的binlog不该被拆开,不论事务多大,也要确保一次性写入。这就涉及binlog cache的
每条SQL语句,MySQL都会经过成本和规则的优化,对这个SQL选择对应的一些访问方法和顺序,包括做一些特殊的改写确保执行效率是最优的,然后优化过后,就会得到一个执 行计划。执行计划,落实到底层,无非就是先访问哪个表,用哪个索引还是全表扫描,拿到数据后如何回表,是否要基于临时磁盘文件做分组聚合或者排序。简单的单表查询,可能这就一条数据,代表它打算如何访问这一个表。explain select *
多表关联的SQL语句到底是如何执行原理平时大多是执行单表查询,通常你把索引建好,让他尽可能走索引,性能都没问题。但其实也有不少的多表关联语句,因为有时查找目标数据,不得不借助多表关联的语法,才能实现你想要但使用多表关联的时候,你的SQL性能就可能会遇到一些问题。最基础的多表关联查询的执行原理select * from t1,t2 where t1.x1=xxx and t1.x2=t2
1 回表的性能消耗无论单列索引 or 联合索引,一个索引就对应一个独立的B+索引树,索引树节点仅包含:索引里的字段值主键值即使根据索引树按条件找到所需数据,也仅是索引里的几个字段的值和主键值,万一你搞个select *,那就还得其他字段,就需回表,根据主键到聚簇索引里找,聚簇索引的叶节点是数据页,找到数据页才能把一行数据所有字段值读出来。 所以类似select * from table order
一般都是设计联合索引,很少用单个字段做索引,因为还是要尽可能让索引数量少,避免磁盘占用太多,影响增删改性能。有个表存储学生成绩,id是自增主键,包含学生班级、学生姓名、科目名称、成绩分数四个字段,平时查询,可能比较多的就是查找某个班的某个学生的某个科目的成绩。所以,我们可以针对【学生班级,学生姓名,科目名称】建立一个联合索引。有两个数据页:第一个数据页里有三条数据,每条数据都包含联合索引的三个字段
更新数据的时候,自动维护的聚簇索引到底是什么?搜索一个主键id对应的行,先去顶层的索引页88里通过二分查找,定位到你应该去下层哪个索引页里继续找。若现在定位到下层的索引页35,此时在索引页35里也有一些索引条目,分别都是下层各索引页(20、28、59)及他们里面最小的主键值,此时在索引页35的索引条目里继续二分查找,容易定位到,应该再到下层的索引页里找。可能从索引页35接着就找到下层的索引页59
DB部署在高配置服务器,磁盘用的RAID 10阵列技术,用了6块磁盘组成RAID 10磁盘阵列架构。RAID 10:有很多磁盘组成一个阵列,所有数据分散写入不同磁盘,因为有多块磁盘,所以你的磁盘阵列整体容量就很大,而且同时写入多块磁盘,让你的磁盘读写并发能力很强: 但这种模式下,最大问题就是若你磁盘坏了一块,就会丢失一部分数据。所以一般若要严格保证磁盘数据不丢失,就得用RAID 1:两块
RR级别的实现如何同时避免不可重复读问题和幻读问题的呢?MySQL让多个事务并发运行的时候能互相隔离,避免同时读写一条数据的时候有影响,是借助undo log版本链条和ReadView机制。RR级别下,你这事务读一条数据,无论读多少次,都是一个值:别的事务修改数据了后即使提交了,你也看不到人家修改的值,这就解决了不可重复读其它事务插入一些新数据,你也读不到,这就避免幻读假设有一条数据是事务id=5
Read Committed,事务运行期间,只要别的事务修改数据并提交,即可读到人家修改的数据,所以会有不可重复读、幻读问题。ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:若为事务自己更新的数据,自己可以读到或在你生成ReadView之前提交的事务所修改的值,也可读到但若你生成ReadView时,就已经活跃的事务,但如果它在你生成ReadVie
1 为何不能直接存个NULL?NULL值列表,一行数据里可能有的字段值是NULL,比如nickname字段,允许为NULL,存储时,如果没赋值,这字段值就是NULL。假设这个字段的NULL值在磁盘存储时,就是按“NULL”字符串存储的,是不是很浪费存储空间而且还奇怪?2 到底怎么存储?不通过字符串,而是通过二进制bit位存储,一行数据里假设有多个字段的值都是NULL,那么这多个字段的NULL,就会
消息传递过程中若失败,则发送方会执行重试,重试就可能产生重复消息。若不处理重复消息,可能收获惊喜。比如一个消费订单消息,统计下单金额的微服务。若不正确处理重复消息,就会出现重复统计。那仅靠MQ能保证消息不重复吗?消息重复必然存在,在MQTT协议,给出三种传递消息时能够提供的1 服务质量标准服务质量从低到高:At most once至多一次。消息在传递时,最多被送达一次。即没什么消息可靠性保证,允许
1 AOP 应用场景AOP,Aspect Oriented Programming,面向切面编程。通过预编译和运行期动态代理,实现在不修改源代码情况下,给程序动态地统一添加功能。AOP设计追求调用者和被调用者之间的解耦,一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制粘贴式的代码,会给程序维护带来不便,AOP 就实现了把这些业务
Aware接口若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。Spring 中提供的 Aware 接口有:BeanNameAware:注入当前 bean 对应 beanNameBeanClassLoaderAware:注入加载当前 bean 的 ClassLoa
1 秒杀的问题服务单一、独立部署秒杀服务即使自己扛不住高并发而宕机,也不要造成服务雪崩。秒杀链接加密避免恶意攻击,机器人模拟秒杀请求避免链接暴露,自己工作人员,提前秒杀商品库存预热、快速扣减秒杀读多写少。无需每次实时校验库存。库存预热,放到Redis,信号量控制进来秒杀的请求。动静分离Nginx做好动静分离。静态资源 Nginx 直接返回,保证秒杀和商品详情页的动态请求才打到后端服务集群。 使用C
交换排序—冒泡排序(Bubble Sort)1 思想待排序的一组数中,对当前还未排序的范围内的全部数,自上而下对相邻两数依次进行:比较调整让较大数往下沉,较小往上冒,故名冒泡排序。即每当两相邻的数比较后,发现它们的排序与排序要求相反时,就互换。 2 实现package com.sss;import java.util.Arrays;/** * @author JavaEdge */public
MySQL日志顺序读写及数据文件随机读写原理MySQL在实际工作时候的两种数据读写机制:对redo log、binlog这种日志进行的磁盘顺序读写对表空间的磁盘文件里的数据页进行的磁盘随机读写1 磁盘随机读MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。如下图有个磁盘文件,里面有很多数据页,可能需要在一个随机位置读取一个数据页到缓存,这就是磁盘随机读因你要读取
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号