数据库
文章平均质量分 84
MongoDB、mysql
it_lihongmin
不要觉得自己怎么样,现实就是比你厉害的人,比你更努力!
当才华撑不起自己野心的时候,老老实实地踏实学习吧!
展开
-
Mysql8主从复制搭建
我们知道Mysql的主从同步机制实现,还是先来一张主从同步的原理图(这里直接使用最经典的那一张),方便搭建已经遇到问题后的解决,这里忽略讲解binlog的格式,以及write log first等原理。实现一主多从读写分离的情况下,不推荐使用Docker搭建mysql,这里使用了官方Compressed TAR Archive搭建Mysql单节点的方式,详细可以参考:Mysql8 CentOS7 Compressed TAR Archive安装,这里默认已经搭建了一个主,根据需求搭建了多个从节点,.原创 2022-04-28 11:11:59 · 1124 阅读 · 0 评论 -
Docker安装Mysql8、并打成镜像在其他内网环境部署
1、docker环境搭建首先安装 Docker的过程省略,可以参考:Docker的基本概念、环境搭建、常用命令【图文】2、docker拉取mysql8镜像docker拉取mysql 8.0.18的镜像: docker pull mysql:8.0.18docker run --name mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=Kevin123 -d mysql:8.0.18运行docker镜像生成容器,说明:--name 容器.原创 2022-04-27 14:54:19 · 3957 阅读 · 1 评论 -
Mysql8 创建新用户设置对特定数据库的读写、远程访问权限
默认当前数据库已经创建,并且Root账号已经ok,可以在服务器端操作,也可以使用root账号在navicat等远程客户端操作,当前是在服务器端操作的过程记录:root 用户登陆: mysql -u root -p 输入密码创建数据:create database demo;创建数据库创建用户,时其可以远程访问(并且设置密码类型):create user 'kevin'@'%' identified with mysql_native_password by 'Kevin123';.原创 2022-04-26 16:40:44 · 3713 阅读 · 0 评论 -
Mysql8 CentOS7 Compressed TAR Archive安装
当前服务器为Centos7,如果是CentOS6则自行下载对应的包。进入Mysql官方下载地址:https://dev.mysql.com/downloads/点击Mysql Community Server,选择下载tag.gz或者tar的安装包,只是压缩方式不同,这里使用tar.gz 包进行安装如下:可以从已上传的百度网盘下载Mysql8.0.27 链接: https://pan.baidu.com/s/1Q5D1--Z4_RcoO1Cmf9RP0Q ...原创 2022-04-26 16:24:17 · 2934 阅读 · 0 评论 -
Mysql8 CentOS7 rpm和rpm Bundle安装
当下载包:wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm或者执行下载后上传,可以使用该百度网盘地址链接: https://pan.baidu.com/s/1dXIr8ypfwBCcURpTgXwREg 提取码: s2ca安装:rpm -ivh mysql80-community-release-el7-11.noarch.rpm查看:cd /etc/yum.repos.d/ 下面是否有mysq原创 2022-04-24 16:35:46 · 3053 阅读 · 0 评论 -
记一次线上sql优化从9s到400ms的过程
最近线上发版的时候,发现有个接口执行特别慢,前端App的表现就是没有任何的反应,然后从pinpoint上追查接口发现是sql执行特别慢,平均都是在9s左右。原创 2022-01-06 17:18:57 · 1957 阅读 · 0 评论 -
Mysql - 慢查询和执行计划
慢查询的相关参数设置:long_query_time: 当查询时间超过多少秒才会被记录为慢查询,默认值为 10,可以设置为 0~10,可以指定设置为微秒;slow_query_log: 慢查询日志开关,默认值是 0 表示关闭, 设置为 1 表示开启;slow_query_log_file:host_name-slow.log,定义慢日志的保存地址,默认是主机名-slow.log;原创 2021-04-07 00:40:33 · 614 阅读 · 0 评论 -
Mysql - 脏页刷新机制
而当内存中的数据页与磁盘中的不一致时该数据页叫作脏页,当执行flush操作将磁盘页数据页和内存数据页进行合并之后,内存和磁盘的数据页相同,则称为干净页原创 2021-04-07 00:34:03 · 2384 阅读 · 1 评论 -
Mysql - 不同级别数据恢复问题
误删数据的级别和处理方式:1、delete误删数据;2、drop table/truncate table 误删数据;3、drop table 误删数据;4、rm误删整个数据库实例;预防为主,如果你是一个公司的技术负责人,怎么制定一套流程?原创 2021-04-07 00:31:57 · 454 阅读 · 0 评论 -
Mysql - 范围查询过程分析底层的锁实现机制(解决幻读、版本读的不可重复读问题)
Mysql的InnoDB本身默认基于B+树索引实现,一方面是对树层高的控制,另一方面区别于其他常用可选索引(红黑树、跳表、散列表、有序集合)的特点就是数据库查询需要支持按照区间查询。这里说的区间包括:>、>=、<、<=、between ... and ...。下面就对范围查询的实现流程进行分析梳理。...原创 2021-04-07 00:24:32 · 889 阅读 · 0 评论 -
Mysql - 深度分页问题的解决方案
深度分页问题是面试的高频,高级开发往上问到的概率都非常大?最容易得到的答案就是,不论where ... order by ... limit m,n 用到了哪些查询条件,都尽量让其在合适的索引或复合索引中完成;基于分表的方式解决;使用子查询主键索引的方式进行优化等。怎么都能回答上来一些但是如何需要深入的全面的理解这部分知识和常用的方案,还是比较麻烦的。...原创 2021-04-06 15:45:13 · 2033 阅读 · 0 评论 -
Mysql - order by执行原理
Mysql中的order by是高频操作,并且对性能影响非常大,所以如果想要对排序有比较深的认知,并且对关键耗时排序进行优化,那么首先需要Mysql内部对于排序操作的实现原理。 在此之前需要对排序算法有比较深入的理解,排序算法种类非常多,但是项目工程中常用的是时间复杂度为O(N*logN)的快速排序和归并排序,Mysql中也使用到了这两种排序方式,项目详解。可以参考:排序算法 - 时间复杂度O(N*logN)的归并、快速排序算法。如果想要对排序有个整体的认识,自己将排序算法按照时间复杂度和场景分类,...原创 2021-04-04 18:22:21 · 1103 阅读 · 0 评论 -
Mysql - join(索引和非索引)的实现原理和优化手段
上一篇博客分析了想要实现的各种join方式和效果,但是对于join(inner join、left join、right join)操作还是一个黑盒子,现在就需要知道join操作内部的运作机制,才能更好的进行优化。join操作按照被驱动表的链接字段是否有索引分为:Index Nested-loop join(简称NLJ)、Block Nested loop join。比如 select * from A inner join B on A.key = B.key where b.key2 = ?,此...原创 2021-04-04 11:29:49 · 3271 阅读 · 0 评论 -
Mysql - join类型和实现的效果
记得又一次面试问道,需要查询类似Oracle的 full outer join的效果,即 join 查询只有左、右独有的数据。当时就完全懵逼了,现在对Mysql的所有join方式进行整理,下一篇博客对join的具体执行流程进行分析和join的性能优化。inner join left join right join Mysql使用union实现类似Oracle的 full outer join的效果 ...原创 2021-04-02 16:10:58 · 592 阅读 · 0 评论 -
Mysql - count(字段)<count(主键 id)<count(1)≈count(*)
当我们需要执行分页查询时等情况,难免需要执行count操作(或叫count聚合函数),下面分析各种count操作的执行流程和效率。如本文标题,直接先给出结论,按照效率排序:count(字段)<count(主键 id)<count(1)≈count(*),所以尽量使用count(*)。 MyISAM存储引擎会直接将count(*)操作的记录下来,需要的时候直接访问,所以效率非常的高,但是不支持事务。现在基本都会直接使用InnoDB,不仅仅是因为支持事务,Mysql - 争取一篇讲...原创 2021-04-01 01:12:03 · 472 阅读 · 0 评论 -
Mysql - delete、重建表过程以及内部的锁状态变化
Mysql执行delete语句后,表空间会被回收吗?答案是不会。其实不光Mysql、Mongo数据库也是一样的。记得当时我们Mongo数据库有下单时的商品快照信息,记录当前下单时的商品状态,主要用于追责(或免责)。当时发现有一两年没有对数据进行删除操作,记录了上几亿条数据,当时DBA就说删除只留最近半年的数据,但是表空间是不会被回收的,当时只知道有这么回事,并不知道内部的真正细节。当删除一条数据后,这条数据的位置就可以被复用了,Mysql是用B+树存储的,数据记录在主键聚簇索引上,当数据页被删除后,也不能回原创 2021-03-31 23:28:32 · 921 阅读 · 0 评论 -
Mysql - 大表全表查询过程(分析底层的数据流转过程)
当我们需要对一整张大表的数据执行全量查询操作,比如select * from t 没有where条件,整个数据有几千万条占用内存大概 100G,而Mysql所在服务器的内存只有8G,那就不直接OOM,将整个数据库打崩了吗? 刚开始开发的时候会有这样的疑问,但是随着时间的推移知道是不会打崩的,但是为什么不会崩,慢慢地就没有好奇心了。下面对整个流程进行分析,主要的冲击点就是Mysql和InnoDB,所以下面还是分成两个部分进行分析。 下面的分析同样适用于所有的查询流程,只是其他查询操作流程更复...原创 2021-03-30 16:38:17 · 2738 阅读 · 1 评论 -
Mysql - 普通索引与唯一索引之间性能差别change buffer
开始之前先做一个总结和对一个误区进行说明(我误解了好久)......总结:普通索引(或没有二级索引)、唯一索引当执行查询操作时,性能本身没有差距;执行写(insert、update、delete)操作时,如果数据页在内存中性能差距也可以忽略;如果数据页不在内存中,那么非唯一索引可以只在change buffer中做修改,而唯一索引一定要从磁盘中获取数据页加载到内存中,判断唯一操作。即只有写操作并且数据页不在Buffer Pool中时,非唯一索引可以利用change buffer将随机访问磁盘操作...原创 2021-03-30 01:35:53 · 1738 阅读 · 1 评论 -
Mysql - InnoDB三大特性之Buffer Pool缓冲池
理解完Mysql的架构图,当一条sql在执行时的路径我们就可以更好的把握了,但是当执行器调用InnoDB引擎接口时,里面如果是一个黑盒子,所有的一切到此都戛然而止,那么需要了解InnoDB的架构图。官方的架构图个人觉得就非常好了所有没有必要再自己画,如下图: 整个InnoDB架构按照内存和磁盘中的存在形式将其分为内存和磁盘中,内存中大体分为三部分:Buffer Pool(Change Buffer)、自适应Hash索引、Log Buffer。 日志缓存区使用了操作系统的...原创 2021-03-29 23:34:02 · 1931 阅读 · 0 评论 -
Mysql - InnoDB三大特性之自适应Hash索引(从数据结构角度分析Mysql中的Hash索引)
自适应Hash索引(Adatptive Hash Index,内部简称AHI)是InnoDB的三大特性之一,还有两个是 Buffer Pool简称BP、双写缓冲区(Doublewrite Buffer)。...原创 2021-03-26 09:10:21 · 4230 阅读 · 2 评论 -
Mysql - InnoDB三大特性之双写缓冲区(Double Write Buffer)
双写缓冲区是InnoDB的大特性之一,还有两个是 Buffer Pool简称BP、自适应Hash索引。doublewrite缓冲区是一个存储区,在该存储区中,在InnoDB将页面写入InnoDB数据文件中的适当位置之前,先从缓冲池中刷新页面。如果在页面写入过程中存在操作系统,存储子系统或意外的mysqld进程退出,则InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到页面的良好副本。 为什么需要双写?个人理解宏观上还是与InnoDB需要支持事务(ACID)特性说起,而...原创 2021-03-25 01:58:02 · 9978 阅读 · 7 评论 -
Mysql - binlog日志、主从复制过程
Mysql级别的日志比较多:主要有:Error log、General Query log、DDL log,可能我们比较关注的还是慢日志(Slow log)和binlog。现在只是分析binlog的一些特性,以及binlog在高可用集群(复制)中的应用,至于更复杂的binlog与redolog怎么保证一个事务语句的一致性和持久化(即崩溃恢复保证crash safe能力),后面单独分析。Binlog日志用于描述数据库更改(DML、DCL)的事件,不记录select、show等语句。binlog包括...原创 2021-03-24 00:21:37 · 527 阅读 · 3 评论 -
Mysql - InnoDB引擎对事务ACID的实现原理分析
Mysql只有InnoDB引擎支持事务,开始分析前先看看事务的相关命令,这些都是下面实验数据会用到的。事务默认的自动提交的,在my.cnf(Windows中是my.ini)配置中设置: autocommit = 1开启事务: begin 或 start transaction; // 只是开启事务,当需要的时候才创建视图 start transaction with consistent snapshot; // 开启事务,并且马上创建视图提交事务:...原创 2021-03-22 23:54:26 · 853 阅读 · 0 评论 -
Mysql - 争取一篇讲清楚Mysql中的锁(全局锁、表级锁、行级锁)及加锁规则、死锁问题
目录全局锁(Flush tables with read lock (FTWRL))表级锁(表锁、MDL读锁写锁)行级锁(行锁、临建锁、间隙锁) Mysql中的锁比较多并且加锁规则复杂,争取这一篇博客可以分析清楚,锁分为全局锁和表级锁是整个Mysql实例和所有的存储引擎都可以使用的。行级锁是InnoDB引擎特有的,而InnoDB最大的区别于其他引擎的特点就是事务,事务与锁、MVCC、Redo Log、Undo Log、Binlog都有关系,所以InnoDB为了实现事务代价还是比较大...原创 2021-03-17 16:22:57 · 1182 阅读 · 0 评论 -
Mysql - 优化器阶段的索引选择过程
当一个表创建了索引,但是执行查询时可能没有走索引,即索引失效。表上创建了多个索引,在执行查询时却选择错了索引。导致没有按照我们写sql和建索引时想要的路径走,这是谁的锅?Mysql架构图中分析了,选择执行的索引由优化器完成,我们可以根据执行计划explain查看选择的索引和执行的路径,此时就需要分析优化器是根据什么来选择的,怎么才能引导按照我们的意图执行。优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。 优化器选择索引的依据有(或者说下面的条件都可能对选择产生影响...原创 2021-03-16 16:12:38 · 1435 阅读 · 0 评论 -
Mysql - MySQL索引(复合索引、覆盖索引、索引下推、前缀索引)
目录存储引擎与底层实现的数据结构InnoDB主键索引和二级索引复合索引覆盖索引(不用回标)索引下推(减少回表次数)存储引擎与底层实现的数据结构 数据结构 - 索引怎么选择合适的数据结构?中分析过能作为索引的数据结构主要有散列表(Hash表)、红黑树、跳表、B+树(B树)以及有序数组,并且分析了它们适合场景。Mysql的索引与存储引擎相关,但是Mysql内常用的存储引擎有InnoDB、MyiSAM、Memory,在Mysql5.5版本后,InnoDB已经作为默认的存储引擎,...原创 2021-03-15 23:27:11 · 1179 阅读 · 0 评论 -
Mysql - Mysql架构图
目录一、Server层1、连接器2、缓存模块3、分析器(分析需要做什么)4、优化器(分析怎么做)5、执行器(执行过程)二、存储引擎层三、查询流程 Mysql服务端架构分为Server层和存储引擎层(可插拔式),Server层主要包含了连接器、缓存模块、分析器、优化器、执行器;可插拔的存储引擎主要有InnoDB、MyISAM、Memory。当一个请求进入后的执行流程如下图的箭头所示:一、Server层1、连接器 连接器主要负责与Mysql客户端建...原创 2021-03-15 17:47:58 · 842 阅读 · 2 评论 -
Mysql - 配置和命令大全(my.cnf)
服务端配置: 客户端配置: Connect_timeout:指的是“连接过程中”的等待时间; wait_timeout:指的是“连接完成后,使用过程中”的等待时间;原创 2021-03-14 22:13:16 · 670 阅读 · 2 评论 -
Mysql - 知识图谱总览
想了很久不知道怎么开始Mysql系列的博客,梳理出了一张图,觉得先从整体开始,按树的结构慢慢展开吧, 一切从Mysql的架构图开始吧,从整体上去把控Mysql,当学习某一个知识点时知道架构图这张大背景图,在哪一个位置,哪一步不迷路。...原创 2021-03-12 16:47:48 · 2037 阅读 · 1 评论 -
Mysql - 5.7单机安装
Windows安装一、安装步骤1、下载安装包阿里云上传的mysql7:https://pan.baidu.com/s/1k0tlcQcM7YMF1nsBQ_3LoQ密码:s4u9也可以下载官方最新版本安装包,(可以下载需要安装的包,如:https://dev.mysql.com/downloads/file/?id=474802,也)可以下载解压解压即用的包,地址为https...原创 2019-05-13 14:29:10 · 458 阅读 · 0 评论 -
MongoDB - 游标
MongoDB有一个很重要的特性就是游标Cursor,当然我们项目中也在使用,所以还是需要好好的进行研究一番。游标可以理解为指针,当去完一个则会将指针指向下一个。若是像我们项目,每天需要同步一遍全部的数据,则使用指正应该是非常合适的。但是它也伴随着很多问题需要注意。1、游标 var cursor = db.user.find({}); # 定义游标 cursor.hasNe...原创 2018-08-05 16:53:41 · 1073 阅读 · 0 评论 -
MongoDB - 查询文档
一、基本查询(find)1、find、findOne db.test.find(); # 默认查询条件为{},查询全部test集合的文档,可以根据条件进行过滤 db.test.findOne(); # 默认查询条件为{},查询满足条件的文档,返回第一条数据2、指定字段查询 按照条件查询返回文档,并且第二个对象参数指定需要返回的字段,默认会返回所有的字段...原创 2018-08-05 00:46:34 · 2245 阅读 · 0 评论 -
MongoDB - 修改文档
一、文档替换 文档替换其实在之前已经有讲过了,就是传入两个对象,第一个对象作为调节,第二个条件作为满足条件的文档修改的内容,例如: db.test.update({"name":"kevin-01"} , {"name": "kevin"}); # 修改 前面条件为,后面为修改的属性和值二、修改器进行修改 文档提交比较好理解,而修改器是在后面一个文档为...原创 2018-08-04 19:30:36 · 1116 阅读 · 0 评论 -
MongoDB - shell
一、mongo基础用法 MongoDB中自带JavaScript shell,可以在shell中使用命令行与MongoDB实例进行交互,在保证MongoDB实例启动的情况下(可以参见MongoDB单机的安装与启动),在bin目录下的mongo进行启动,1、默认会链接到test数据库:2、若想链接到远程的某一mongoDB实例,则:./mongo ip:port/数据库名称...原创 2018-07-29 22:36:54 · 412 阅读 · 0 评论 -
MongoDB - 单机安装和CRUD操作
一、MongoDB单机安装 需要提前下载mongo的tar包或者zip包。1、wondows 不做解释,启动的时候需要配置数据库的存放地址和日志地址,同下。2、linux(Centos7) cd /data/mongo # mongo安装的根目录 mkdir data # 创建mong...原创 2018-07-29 18:24:47 · 309 阅读 · 0 评论 -
MongoDB - 开篇
知道mongoDB好几年了,但是真的一直没有好好的研究过,知道是nosql(not only sql),BSON的文档数据结构等等,但一直都是单机使用。现在进入新的项目组,使用MongoDB进行商品数据的存储,不知道为什么会选择MongoDB为数据库。后面知道一点点是因为MongoDB的集合的动态模式(dynamic schema)特性,可以适应商品的不断变化的需求。于是想好好的对Mong...原创 2018-07-29 11:47:17 · 285 阅读 · 0 评论 -
MongoDB - 索引的管理和类型
MongoDB的索引与mysql的索引大致相同,但是由于MongoDB的特有性,比如文档可能不会存在某一个字段,文档有嵌套以及数组类型,所以也会有些许差异。为了测试数据,和demo的使用,单节点上创建一个1千万的文档,如下:for(i=0; i<1000000; i++) { db.user.insert({"i":i,"username":"user"+i,"age"...原创 2018-08-06 23:23:04 · 5657 阅读 · 0 评论 -
MongoDB - 索引使用注意事项、执行计划(explain)
一、Mongo使用索引注意事项1、低效率查询 1)、$where和$exists完全不能走索引 首先$where是完全不能使用索引的,而$exists也是不可以使用稀疏索引进行查询,因为不存在的字段和值为null的存储方式是一样的,不能有效的过滤掉为null的字段。 2)、$ne取反操作效率很低 取反操作即使可以走索引也需要对全索引进行查询,否则...原创 2018-08-11 11:52:28 · 3885 阅读 · 1 评论 -
MongoDB - 聚合
一、聚合命令 1、count db.user.count({"i":{"$gt":NumberInt("5700")}}); # 根据条件查询并count 2、distinct db.runCommand({"distinct":"user","key":"age"}); # 查询user集合中不同年龄的总数,相当于gr原创 2018-08-12 00:29:09 · 1019 阅读 · 0 评论 -
MongoDB - MapReduce
使用MapReduce即分为map和reduce两个步骤的操作,将一个任务拆分为多个任务执行。可以并行在多个计算机上进行执行。可以认为是聚合框架的一部分,但是执行速度较慢,一般用户数据分析。但是数据分析一般会使用es或直接使用大数据的mapreduce或者直接使用spark。自己不是很清楚使用场景,后续进行研究。。。...原创 2018-08-12 00:42:56 · 162 阅读 · 0 评论