数据库
个人平时总结数据库相关知识
A鱼翔浅底A
每天进步一点点...
QQ:1106533113
展开
-
Mysql总结
mysql学习总结原创 2022-08-27 15:34:18 · 486 阅读 · 0 评论 -
Redis总结
redis 使用个人总结原创 2022-02-08 11:31:54 · 517 阅读 · 0 评论 -
Redis内存淘汰策略----LRU LFU
一、一般LRU算法LRU(Least Recently Used)是一种内存淘汰算法。 实现 LRU 算法除了需要 key/value 字典外,还需要附加一个链表,链表中的元素按照一定的顺序进行排列。当空间满的时候,会踢掉链表尾部的元素。当字典的某个元素被访问时,它在链表中的位置会被移动到表头。所以链表的元素排列顺序就是元素最近被访问的时间顺序。位于链表尾部的元素就是不被重用的元素,所以会被踢掉。位于表头的元素就是最近刚刚被人用过的元素,所以暂时不会被踢。二、Redis LRU策略(1) 内存淘汰策原创 2020-08-29 17:43:21 · 1038 阅读 · 0 评论 -
Redis:过期策略
一、过期策略概述Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。你可以想象Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。你还可以进一步站在死神的角度思考,会不会因为同一时间太多的 key 过期,以至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。二、过期的 key 集合redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这原创 2020-08-29 12:34:35 · 152 阅读 · 0 评论 -
Redis:redis-cluster分布式解决方案
redis-cluster 配置1. 下载源码包从官网下载redis 6.0.6 版本的源码包,解压并且进入src,然后make,将可执行程序拷贝出来使用即可.下载地址:redis.tar.gzshell> cd srcshell> make2. redis-cluster配置//1. 创建redis 实例shell> mkdir -p 7000/data 7001/data 7002/data 7003/data 7004/data 7005/datashell>原创 2020-08-24 18:29:16 · 465 阅读 · 0 评论 -
Redis:codis分布式集群解决方案
一、codis介绍在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘。首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载时间,特别是在云环境下,单个实例内存往往都是受限的。其次体现在 CPU 的利用率上,单个 Redis 实例只能利用单个核心,这单个核心要完成海量数据的存取和管理工作压力会非常大。正是在这样的大数据高并发的需求之下,Redis 集群方案应运而生。它可以将众多小内存的原创 2020-08-24 15:21:57 · 552 阅读 · 0 评论 -
Redis:Redis Sentinel
一、Redis Sentinel 的安装检查一下自己的系统里面有没有安装redis-sentinel命令,如果没有 可以选择安装redis-sentinel://我这里已经安装了shell> which redis-sentinel /usr/bin/redis-sentinel//安装方法:(ubuntu18.04)shell> apt search redis | grep sentinelshell> apt install redis-sentinelshell原创 2020-08-21 19:00:08 · 801 阅读 · 0 评论 -
Redis:主从同步
一、CAP 原理在了解 Redis 的主从复制之前,让我们先来理解一下现代分布式系统的理论基石——CAP 原理。1. CAP原理介绍CAP 原理就好比分布式领域的牛顿定律,它是分布式存储的理论基石。C - C onsistent ,一致性A - A vailability ,可用性P - P artition tolerance ,分区容忍性2. 网络分区分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有网络断开的风险,这个网络断开的场景的专业词汇叫着「网络分区原创 2020-08-20 17:23:50 · 182 阅读 · 0 评论 -
Redis:事务
一、Redis事务Redis 的事务使用非常简单,不同于关系数据库,我们无须理解那么多复杂的事务模型,就可以直接使用。不过也正是因为这种简单性,它的事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 Redis。二、Redis事务使用Redis 在形式上看起来也差不多,分别是 multi/exec/discard。multi 指示事务的开始,exec 指示事务的执行,discard 指示事务的丢弃。//事务基本使用> multiOK> incr booksQUEUE原创 2020-08-20 12:47:01 · 121 阅读 · 0 评论 -
Redis:持久化
一、Redis持久化必要性Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。二、Redis持久化机制快照AOF日志混合持久化(Redis 4.0)三、快照1. 快照特点是一次全量备份快照是内存数据的二进制序列化形式,在存储上非常紧凑加载快照速度比AOF日志快2. 快照原理(1) 问题引入我们知道 Redis 是单线程程序,这个线程要同时负责多个客户端套接字的原创 2020-08-19 20:41:28 · 115 阅读 · 0 评论 -
Redis:GeoHash算法
一、附近的人问题1. 用数据库求解当然,现在数据库基本上都引入了相关功能,这里只介绍最普通的实现方式。(1) 问题引入如果要计算「附近的人」,也就是给定一个元素的坐标,然后计算这个坐标附近的其它元素,按照距离进行排序,该如何下手?如果现在元素的经纬度坐标使用关系数据库 (元素 id, 经度 x, 纬度 y) 存储,你该如何计算?(2) 算法思想首先,你不可能通过遍历来计算所有的元素和目标元素的距离然后再进行排序,这个计算量太大了,性能指标肯定无法满足。一般的方法都是通过矩形区域来限定元素的数量,原创 2020-08-19 12:39:05 · 523 阅读 · 0 评论 -
Redis:限流算法
一、限流算法分类简单限流算法漏斗限流算法(令牌桶算法)分布式漏斗限流算法(分布式令牌桶算法)二、简单限流算法1. 问题引入系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使用 Redis 的数据结构来实现这个限流的功能?2. 解决方案这个限流需求中存在一个滑动时间窗口,想想 zset 数据结构的 score 值,是不是可以通过 score 来圈出这个时间窗口来。而且我们只需要保留这个时间窗口,窗口之外的数据都可以砍掉。那这个 zset 的 value 填什么比较合适呢?它原创 2020-08-18 19:00:43 · 993 阅读 · 0 评论 -
Redis:布隆过滤器
一、布隆过滤器1. 定义它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。主要用来去重,且空间占用少2. 特点具有去重功能,并且空间相比较其他数据结构,占用很少当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在布隆过滤器可以插入元素,但不可以删除已有元素.只要参数调整合适(需要添加的总元素数量和误差率),误差率可以控制3. 用途新闻推荐系统(用户看过的新闻不推荐)爬虫url去重垃圾邮件过滤其他等等4. 算法原理原创 2020-08-18 16:19:17 · 170 阅读 · 0 评论 -
Redis:延时队列
Redis延时队列延时队列可以通过 Redis 的 zset(有序列表) 来实现。我们将消息序列化成一个字符串作为 zset 的 value,这个消息的到期处理时间作为 score,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行。Redis延时队列实现这里借助C库hiredis实现。hiredis官网地址Redis LuaRedis延时队列实现...原创 2020-08-17 20:15:41 · 118 阅读 · 0 评论 -
Redis:分布式锁
一、定义分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。二、指令//这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解//将竞争锁和设置超时绑定成一个原子操作 避免死锁> set lock:book 1 ex 10 nx> dosomething> del lock:book三、超时问题1. 问题描述Redis 的分布式锁不能解决超时问题,如果在加锁和释放锁原创 2020-08-13 16:26:31 · 246 阅读 · 0 评论 -
mysql:性能调优
mysql性能调优mysql性能调优设计到方方面面,我在这里就抛砖引玉一、CPU选择1. 选择标准OLTP需要IO密集型操作 OLAP是CPU密集型操作。所以为了支持更大内存,最好选择支持64位的多核CPU。2. 调优方式可以利用CPU多核特性,增大读写线程的个数.mysql> show variables like 'innodb_%io_threads' ;+-------------------------+-------+| Variable_name原创 2020-08-11 20:58:58 · 447 阅读 · 0 评论 -
mysql:备份与恢复
一、概述1. 备份分类这里需要理解数据库备份的一致性,这种备份要求在备份的时候数据在这一时间点上是一致的。举例来说,在一个网络游戏中有一个玩家购买了道具,这个事务的过程是:先扣除相应的金钱,然后向其装备表中插入道具,确保扣费和得到道具是互相一致的。否则,在恢复时,可能出现金钱被扣除了而装备丢失的问题。(1) 按备份的方法不同划分:Hot Backup(热备):是指数据库运行中直接备份,对正在运行的数据库操作没有任何的影响。这种方式在MySQL官方手册中称为Online Backup(在线备份)C原创 2020-08-08 18:53:25 · 251 阅读 · 0 评论 -
mysql:事务
一、定义事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一。二、事务ACID特性原子性(atomicity):简单来说,要么都做,要么都不做一致性(consistency):一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。隔离性(isolation):每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不原创 2020-08-05 20:56:00 · 277 阅读 · 0 评论 -
mysql:undo log
一、定义用来进行事务回滚操作所需要的文件。二、作用对事务进行回滚操作MVCC控制,当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现一致性非锁定读取。三、存放位置在共享表空间内的undo log段。四、注意undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。所有修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。undo log会产生redo log,也就是undo log的产生会伴随着redo log的产生原创 2020-08-05 18:22:29 · 765 阅读 · 1 评论 -
mysql:锁
一、锁定义锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。这里还要区分lock与latch:latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务com原创 2020-08-01 17:47:30 · 126 阅读 · 0 评论 -
mysql:全文检索
mysql全文索引的使用原创 2020-07-29 12:38:19 · 248 阅读 · 0 评论 -
mysql:索引使用优化
mysql索引的建立与优化原创 2020-07-29 12:37:48 · 338 阅读 · 0 评论 -
mysql:索引使用
mysql索引分类和使用原创 2020-07-29 12:36:57 · 462 阅读 · 0 评论 -
mysql:重做日志文件(redo log file)
一、重做日志文件1. 重做日志定义在默认情况下,在InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件。在MySQL官方手册中将其称为InnoDB存储引擎的日志文件,不过更准确的定义应该是重做日志文件(redo log file)。为什么强调是重做日志文件呢?因为重做日志文件对于InnoDB存储引擎至关重要,它们记录了对于InnoDB存储引擎的事务日志,记录的是关于每个页(Page)的更改的物理情况。2. 重做日志作用当实例或介质失败(media fail原创 2020-07-17 19:04:10 · 2212 阅读 · 0 评论 -
mysql:慢查询日志(slow_log)
一、慢查询日志(slow_log)慢查询日志(slow log)可帮助DBA定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。例如,可以在MySQL启动时设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。DBA每天或每过一段时间对其进行检查,确认是否有SQL语句需要进行优化。二、慢查询日志设置1. 慢查询日志开启//开启慢查询日志mysql> set global slow_query_log=ON;Query OK, 0 rows affected (0.原创 2020-07-17 17:06:51 · 5731 阅读 · 1 评论 -
mysql:二进制日志(binlog)
一、二进制日志(binary log)二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。然而,若操作本身并没有导致数据库发生变化,那么该操作可能也会写入二进制日志。二、二进制日志作用恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的My原创 2020-07-17 12:51:06 · 603 阅读 · 1 评论 -
mysql:InnoDB关键特性:刷新邻接页
一、刷新邻接页原理InnoDB存储引擎还提供了Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。二、刷新邻接页优点通过AIO可以将多个IO写入操作合并为一个IO操作,故该工作机制在传统机械磁盘下有着显著的优势。三、刷新邻接页开启与关闭开启与关闭需要考虑到下面两个问题:是不是可能将不怎么脏的页进行了写入,而该页之后又会很快变成脏页?固态硬盘有着较高的IOPS,是原创 2020-07-16 18:42:03 · 368 阅读 · 0 评论 -
mysql:InnoDB关键特性:异步IO
一、IO分类Sync IO:即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。AIO(Asynchronous IO) :发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成.Native AIO:内核级别提供的AIO支持二、InnoDB 异步IO1. InnoDB异步IO优势Sync IO,即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。但是如果用户发出的是一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页原创 2020-07-16 18:35:45 · 771 阅读 · 0 评论 -
mysql:InnoDB关键特性:自适应哈希索引(AHI)
一、自适应哈希索引(Adaptive Hash Index,AHI)1. 定义哈希(hash)是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次的查询。InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。AHI是通过缓冲池的B+树页构原创 2020-07-16 17:21:40 · 1398 阅读 · 0 评论 -
mysql:InnoDB关键特性:两次写
一、问题引入当发生数据库宕机时,可能InnoDB存储引擎正在写入某个页到表中,而这个页只写了一部分,比如16KB的页,只写了前4KB,之后就发生了宕机,这种情况被称为部分写失效(partial page write)。在InnoDB存储引擎未使用doublewrite技术前,曾经出现过因为部分写失效而导致数据丢失的情况。有经验的DBA也许会想,如果发生写失效,可以通过重做日志进行恢复。这是一个办法。但是必须清楚地认识到,重做日志中记录的是对页的物理操作,如偏移量800,写’aaaa’记录。如果这个页本身原创 2020-07-16 16:55:53 · 282 阅读 · 0 评论 -
mysql:InnoDB关键特性:插入缓冲
一、InnoDB索引1. 聚集索引(Cluster Index)聚集索引就是按照每张表的主键构建一个B+树,同时叶子节点存放的即为整张表的行记录数据,我们也将聚集索引的叶子节点称为数据页。聚集索引的结构决定了索引组织表中数据也是索引的一部分。由于B+树索引本身是有序的,同时数据行也存储在叶子节点上,因此通过聚集索引我们能够很快的访问针对范围值的查询。2. 辅助索引(Secondary Index)InnoDB中所有除聚集索引以外的所有索引都被称为辅助索引。对于辅助索引,叶子节点并不包含行记录的全部数原创 2020-07-16 12:24:56 · 282 阅读 · 0 评论 -
mysql Innodb Checkpoint机制
一、问题引入前面已经讲到了,缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟。因此页的操作首先都是在缓冲池中完成的。如果一条DML语句,如Update或Delete改变了页中的记录,那么此时页是脏的,即缓冲池中的页的版本要比磁盘的新。数据库需要将新版本的页从缓冲池刷新到磁盘。倘若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常大的。若热点数据集中在某几个页中,那么数据库的性能将变得非常差。同时,如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那么数据就不能恢复了。为了避免发生数据丢失原创 2020-07-15 21:21:49 · 262 阅读 · 0 评论 -
mysql的Innodb缓冲池管理:LRU List、Free List和Flush List
一、Innodb内存管理策略1. LRU List管理在上一篇博客中我们知道了缓冲池是一个很大的内存区域,其中存放各种类型的页。那么InnoDB存储引擎是怎么对这么大的内存区域进行管理的呢?通常来说,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中尾端的页。在InnoDB存储引擎中,缓冲池中页的大小默认为16KB,同样使用LR原创 2020-07-14 21:48:09 · 1914 阅读 · 2 评论 -
mysql的InnoDB体系架构
一、InnoDB体系架构概述InnoDB存储引擎的架构如下图所示,从图可见,InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:❑维护所有进程/线程需要访问的多个内部数据结构。❑缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存。❑重做日志(redo log)缓冲。等等二、后台线程后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下I原创 2020-07-14 20:53:08 · 293 阅读 · 1 评论 -
mysql存储引擎概述
一、mysql存储引擎优势MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性。存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是有好处的。对于DBA来说,他们应该深刻地认识到MySQL数据库的核心在于存储引擎。二、查看本机mysql支持的存储引擎ubuntu@vm10-0-0-63:~$ mysql --versionmysql Ve原创 2020-07-14 12:11:41 · 250 阅读 · 0 评论 -
mysql体系结构
数据库和实例定义数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。实例:MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。mysql基本操作mysql --help 查看相关帮助信息mysql --version:查原创 2020-07-14 12:03:16 · 147 阅读 · 0 评论 -
mysql出现ERROR 1698 (28000): Access denied for user ‘root‘@‘localhost‘错误解决方法
一、mysql安装msyql安装二、mysql问题描述我的操作系统是ubuntu18.04,以下是我的mysql版本:安装完成后,登录mysql的时候就出现了如下错误:因为安装的过程中没让设置密码,可能密码为空,但无论如何都进不去mysql。那么该怎么做呢,接下来就将这个解决方法总结记录一下。三、问题解决step1:在ubuntu的terminal(也即终端)上输入:sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf进入到这个配置文件,然后在这个原创 2020-07-10 18:55:18 · 218 阅读 · 0 评论 -
mysql的安装
一、mysql安装本文在Ubuntu 18.04 上安装msyql。执行以下命令:sudo apt install mysql-serversudo apt install mysql-client安装过程中会提示设置密码什么的,注意设置了不要忘了(但是实际情况是很可能不提示设置密码),安装完成之后可以使用如下命令来检查是否安装成功:sudo netstat -tap | grep mysql通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安原创 2020-07-10 18:40:26 · 145 阅读 · 0 评论 -
python 操作 mqsql 数据库
python 操作 mqsql 数据库参考网址:http://www.runoob.com/python/python-mysql.htmlhttp://www.cnblogs.com/fnng/p/3565912.html 1、安装mqsql客户端和服务器略过2、安装MySQLdbMySQLdb是python操作mysql数据库的一个python库,原创 2017-07-06 14:59:37 · 330 阅读 · 0 评论