随笔分类 - 数据库
摘要:一、Mysql 中索引的创建删除 innodb 和 myisam 引擎会自动为主键或者带有 UNIQUE 属性的列建立索引。 如果要为其他列建立索引,就需要显示的指明。 1. 创建表的时候创建索引 CREATE TABLE 表名 ( 各个列的信息..., (KEY/INDEX) 索引名 (需要被索引
阅读全文
摘要:一、根页面万年不动 在之前的文章里,为了方便理解,都是先画存储用户记录的叶子节点,然后再画出存储目录项记录的内节点。 但实际上 B+ 树的行成过程是这样的: 每当为某个表创建一个 B+ 树索引,都会为这个索引创建一个根节点页面。最开始表里没数据,所以根节点中既没有用户记录,也没有目录项记录。 当往表
阅读全文
摘要:接上一篇内容。 一、聚簇索引 其实之前内容中介绍的 B+ 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建,InnoDB 引擎会自动创建。另外,在 InnoDB 引擎中,聚簇索引就是数据的存储方式。 它有 2 个特点: 特点 1 使用记录主键值的大小进行记录和页的排序。 其中又
阅读全文
摘要:接上一篇内容,InnoDB 的作者想到一种更灵活的方式来管理所有目录项,是什么? 一、目录项记录页 其实这些用户目录项与用户记录很像,只是目录项中的两个列记录的是主键和页号而已,那么就可以复用之前存储用户记录的数据页来存储目录项。 为了区分用户记录和目录项,仍然使用 record_type 这个属性
阅读全文
摘要:一、没有索引的时候如何查找 先忽略掉索引这个概念,如果现在直接要查某条记录,要如何查找呢? 在一个页中查找 如果表中的记录很少,一个页就够放,那么这时候有 2 种情况: 用主键为搜索条件:这时就是之前文章提过的方式,页面目录中用二分法快速定位到槽,然后遍历该槽对应分组的记录,最终找到指定记录。 用其
阅读全文
摘要:一、页目录和槽 接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表。 那么我使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infrimum 记录开始,一直向后找,只要存在总会找到。这种在数据量少的时候还好说,一旦数据多了,遍历耗时一定非常长。 于是,作者又想到了一个好办法,灵
阅读全文
摘要:InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构。而学习页结构,是为了更好的学习索引。 一、页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的大小一般是 16kb。 为了达成不同的目的,作者设计了多种类型的页,比如: 存放表空间头部信息的页
阅读全文
摘要:查数据大家都经常干,但是你知道从执行sql到看到结果,mysql背后都做了什么事情吗? 一、mysql的架构 client/server 这种客户端到服务端的架构,大家一定都很熟悉,其实 mysql 也与之类似。 可以有多个客户端与服务端连接。 客户端可以向服务端发送增删查改的请求。 服务端根据请求
阅读全文
摘要:啥也不说了,面试高频问题。 一、缓存穿透 用户想要查询一个数据,发现redis内存数据库中没有,也就是说没有命中缓存,也是会向持久层数据库查询,发现也没有,那么本次查询失败。 如果此时,用户很多,高并发场景下都去查这个数据,由于缓存都没有命中,于是压力直接打到持久层数据库那里,这就是缓存穿透。 通常
阅读全文
摘要:bitmap数据结构,是基于二进制位来进行操作记录的,只有0 和 1两个状态。 可以想象成一个数组,里面只有0或者1。 能干嘛呢? 现实中会有这些场景,比如统计用户信息,活跃用户和非活跃用户、登录的、未登录的用户,打卡的、未打卡的,像这种只有2个状态,并且数据量非常大的,就适合使用bitmap。 网
阅读全文
摘要:HyperLogLog 是用来做基数统计的算法。 先了解下什么是基数。 比如数据集{1, 3, 5, 7, 5, 7, 8},那么这个数据集的基数集为{1, 3, 5 ,7, 8},基数(不重复元素)为5。 如果,现在需要统计一下网页的UV,那么就会涉及到去重了,这种场景就很适合用HyperLogL
阅读全文
摘要:这是在redis 3.2版本推出的,推算地理位置的信息,两地之间的距离,周围方圆的人等等场景都可以用它实现。 一、geoadd 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。 这里可以借助网上的一些查询经纬度的工具来获取数据。 geoadd china:city 121.472644
阅读全文
摘要:有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是有序集合每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加、删除、
阅读全文
摘要:redis里的hash是一个string类型的field(字段)和value(值)的映射表。特别适合用于存储对象,每个hash可以存储40多亿键值对。 熟悉python的童鞋可以想象成字典dict。之前的数据类型存储都是k-v这样,而hash的存储就是k-dict,dict里又会有属于自己的k-v。
阅读全文
摘要:Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 另外,redis中的set是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 一、sadd 添加一个、多个元素 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。 若key不存
阅读全文
摘要:在redis里,可以把list巧妙的运用成 栈、队列、阻塞队列等。 一、push 插入元素 1. lpush,在头部插入 将一个值或者多个值,插入到列表的头部。 lpush list one lpush list two lpush list three 使用lpush,这里的l可以看成left,也
阅读全文
摘要:一、append 追加字符串 append name 2222 二、strlen 获取key 字符串长度 strlen name 三、自增、自减 文章浏览量,点赞可以用这种实现。 incr age decr age 注意这里得是数字才可以进行,所以重设置了一个key。String类型除了可以存字符串
阅读全文
摘要:Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询,bitmaps,hyperloglog
阅读全文
摘要:一、Redis是什么 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 而且免费、开源,是当下最热门的Nosql技术之一,也被称为结构化数据库。re
阅读全文
摘要:感谢B站狂神的学习资源,有兴趣的小伙伴可以去搜索:遇见狂神说。 再说下我为啥要学redis,因为在面试中遇到过,并且没答好,就这么简单。 不过在正式学习redis之前,要先了解NoSQL。 一、什么是NoSQL NoSQL是一个泛称,泛指非关系型的数据库。 NoSQL并不是没有sql的意思,而是 N
阅读全文