![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库系列
文章平均质量分 64
技术砖家--Felix
I'm felix li
展开
-
Mysql引擎innodb的脏读,不可重复读,幻读问题
不可重复读是指在一个事务内多次读取一个集合数据,这个事务还没有结束时,另外一个事务对这个集合数据做了DML操作,因此第一个事务中的两次读取数据之间,由于第二个事务的操作,造成了两次数据不一样,这种情况称为不可重复读。示例中,会话A开启一个事务读取数据,读到一条数据,此时会话B插入了一条数据,并且提交了,随后会话A又进行了一次读取数据,读到两条,造成会话A两次读取数据记录不一致。不可重复读和脏读的区别是:脏读是读取未提交的数据,不可重复读是读取到已提交的数据,但违反了数据库事务一致性的要求。原创 2022-10-26 11:45:36 · 492 阅读 · 0 评论 -
MySQL中 in 和 exists区别
MySQL中 in 和 exists区别MySQL中的in 语句是把外表和内表作hash 连接,而 exists语句是对外表作 loo循环,每次 loop 循环再对内表进行查询。一直大家都认为 exists 比 in 语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。1、 如果查询的两个表大小相当,那么用 in 和 exists 差别不大。2、 如果两个表中一个较小一个是大表,则子查询表大的用 exists,子查询表小的用 in。3、 not in 和 not exists:如果查询语原创 2022-01-14 15:41:24 · 717 阅读 · 0 评论 -
Mysql悲观锁和乐观锁的选择
mysql数据库锁数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制-- 核心 SQL,主要靠 for updateselect status from t_goods where id=1 fo原创 2022-01-14 14:49:04 · 412 阅读 · 0 评论 -
一致性锁定读
一致性锁定读在默认配置下,即事务的隔离级别为REPEATABLE READ模式下,InnoDB存储引擎的SELECT操作使用一致性非锁定读。但是在某些情况下,用户需要显式地对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支持加锁语句,即使是对于SELECT的只读操作。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作:SELECT…FOR UPDATESELECT…LOCK IN SHARE MODESELECT…FOR UPDATE对转载 2021-12-16 14:43:10 · 562 阅读 · 1 评论 -
for update的使用
一、for update定义for update是一种行级锁,又叫排它锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。只有当出现如下之一的条件,才会释放共享更新锁:1、执行提交(COMMIT)语句2、退出数翻译 2021-12-09 10:16:31 · 2575 阅读 · 0 评论 -
Mysql 8查看并修改事务隔离级别
Mysql 8查看并修改事务隔离级别转载 2021-12-02 19:25:27 · 765 阅读 · 0 评论 -
一致性非锁定读(MVCC)
一致性非锁定读原创 2021-12-02 19:23:15 · 88 阅读 · 0 评论 -
InnoDB 意向锁
锁意向锁案例考虑这个例子:事务A锁住了表中的一行,让这一行只能读,不能写。之后,事务B申请整个表的写锁。如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的。数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁。数据库要怎么判断这个冲突呢?step1:判断表是否已被其他事务用表锁锁表step2:判断表中的每一行是否已被行锁锁住。注意step2,这样的判断方法效率实在不高,因为需要遍历整个表。于是就有了意向锁。在意向锁存在的情况下,事务A原创 2021-11-30 20:12:39 · 101 阅读 · 1 评论 -
B+树(聚集,辅助,覆盖索引)
索引一个常常被DBA忽视的问题是:B+树索引并不能找到一个给定键值的具体行B+树索引能找到的只是被査找数据行所在的页。然后数据库通过把页读入到内存,再在内存中进行查找,最后得到要查找的数据。...原创 2021-11-30 14:52:00 · 509 阅读 · 1 评论 -
重做日志redo log
重做日志文件在默认情况下,在 InnodB存储引擎的数据目录下会有两个名为 ib logfile0和logfile1的文件。在 MySQL官方手册中将其称为 InnoDB存储引擎的日志文件,不过更准确的定义应该是重做日志文件( redo log file)。为什么强调是重做日志文件呢?因为重做日志文件对于 InnodB存储引擎至关重要,它们记录了对于 innodb存储引擎的事务日志。当实例或介质失败(media faliure)时,重做日志文件就能派上用场。例如,数据库由于所在主机掉电导致实例失败,i原创 2021-11-16 19:34:38 · 941 阅读 · 0 评论 -
二进制日志binlog
二进制日志( binary log)记录了对 MySQL数据库执行更改的所有操作,但是不包括 SELECT和sHow这类操作,因为这类操作对数据本身并没有修改。然而,若操作本身并没有导致数据库发生变化,那么该操作可能也会写入二进制日志。例如:从上述例子中可以看到, MySQL数据库首先进行 UPDATE操作,从返回的结果看到Changed为0,这意味着该操作并没有导致数据库的变化。但是通过命令SHOW BINLOG EVENT可以看出在二进制日志中的确进行了记录。如果用户想记录 SELECT和S原创 2021-11-16 17:10:07 · 1259 阅读 · 1 评论 -
深入浅出索引(索引数据结构)
文章主要内容(摘自评论)索引的作用:提高数据查询效率常见索引模型:哈希表、有序数组、搜索树哈希表:键 - 值(key - value)。哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置哈希冲突的处理办法:链表哈希表适用场景:只有等值查询的场景有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N))有序数组查询效率高,更新效率低有序数组的适用场景:静态存储引擎。二叉搜索树:每个节点的左儿子小于父节点,父节点翻译 2021-11-15 14:15:50 · 218 阅读 · 0 评论 -
事务隔离级别的实现和原理
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQ转载 2021-11-11 14:38:17 · 835 阅读 · 1 评论 -
日志系统(redolog,binlog)一条SQL更新语句是如何执行的?
一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:mysql> create table T(ID int primary key, c int);如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写:mysql> update T set c=c+1翻译 2021-11-09 12:01:31 · 200 阅读 · 0 评论 -
出现 Lock wait timeout exceeded; try restarting transaction报错的几种情况解决方式
1, 查看事务 运行情况select * from information_schema.innodb_trx2,查看结果,直接killtrx_mysql_thread_id为线程id,直接kill 183,如果trx_mysql_thread_id为0,则说明是xa事务XA事务的回滚操作xa recover;如果data为:172.31.128.1:8091:4873088614704820233-4873088614704820235如果formatID:9752如果gtri原创 2021-11-02 11:37:27 · 2515 阅读 · 0 评论 -
为什么MySQL数据库索引选择使用B+树?
为什么MySQL数据库索引选择使用B+树?在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树!学过数据结构的一般对最基础的树都有所认识,因此我们就从与我们主题更为相近的二叉查找树开始。一、二叉查找树(1)二叉树简介:二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:1、任意节点左子树不为空,则左子树的值均小翻译 2021-10-12 15:42:45 · 592 阅读 · 0 评论 -
Mysql索引原理和使用姿势
索引的简单使用建立一个表写入了20几万条数据没有索引的搜索SELECT * FROM `order` WHERE CODE = '1001' [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0aF5i7B-1634017470390)(https://files.mdnice.com/user/14959/3e0bf53c-59f2-4d75-840d-a4db9642023e.png)]耗时:0.376s4,给code建立索引,同样进行搜索原创 2021-10-12 13:45:01 · 373 阅读 · 0 评论 -
一条sql的旅程
转载 2021-10-11 10:40:04 · 69 阅读 · 0 评论 -
redis缓存淘汰策略原理分析
相关配置为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配置项:maxmemory设置内存使用上限,该值不能设置为小于 1M 的容量。选项的默认值为 0,此时系统会自行计算一个内存上限。maxmemory-policy熟悉 redis 的朋友都知道,每个数据库维护了两个字典:db.dict:数据库中所有键值对,也被称作数据库的 keyspacedb.expires:带有生命周期的 key 及其对应的 TTL(存留时间),因此也被称作 expire s翻译 2021-10-09 16:20:23 · 1336 阅读 · 1 评论 -
Mysql分页以及优化的几种方式。
1,分页语句m:页的长度,n:分页起始位置大小第一种写法 select * from [table_name] limit m offset n;第二种写法select * from [table_name] limit n , m;获取从第n个开始的m个记录。select * from `order` limit 10获取从第1个开始的m个记录2,分页优化直接使用limit函数进行分页,在数据小的情况下没什么问题,但数据量过大,则会显得很吃力。下面以一张简单的订单表为原创 2021-09-07 10:42:38 · 4474 阅读 · 3 评论 -
Mysql事务实现的原理
事务的持久性(redo log)redo log的作用是解决下面的问题:InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中,Bu.原创 2021-06-18 17:39:13 · 165 阅读 · 0 评论 -
新浪微博在数据存储(数据库和缓存)上做了什么?
本文是来自极客时间作家微博技术专家所写。微博存储那些事儿Mysql为了减少对MySQL数据库的访问压力,在前面部署了Memcached缓存,挡住了99%的访问压力,只有1%的请求会访问数据库。然而对于微博业务来说,这1%的请求也有几万QPS,对于单机只能扛几千QPS的MySQL数据库来说还是太大了。为此我们又对数据库端口进行了拆分,你可以看下面的示意图,每个用户的UID是唯一的,不同UID的用户按照一定的Hash规则访问不同的端口,这样的话单个数据库端口的访问量就会变成原来的1/8。除此之外,考虑到微博原创 2021-05-24 14:05:48 · 1436 阅读 · 0 评论 -
mysql按天聚合
SELECT count(*),date_format(create_time, '%Y-%m-%d') as create_date FROM member GROUP BY date_format(create_time, '%Y-%m-%d') order by create_time DESC ;原创 2021-04-14 11:21:26 · 716 阅读 · 1 评论 -
mysql中delete、truncate、drop的区别有哪些?
MySQL删除数据的方式都有哪些?咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。一、从执行速度上来说drop > truncate >> DELETE二、从原理上讲1、DELETEDELETE from TABLE_NAME where xxx1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger;2、在 InnoDB 中,DELETE其实并不转载 2020-10-21 09:50:42 · 2074 阅读 · 0 评论 -
Springboot集成ElasticSearch详解(付代码详解)
一、ElasticSearch 简介. 1、简介. 2、特性. 3、使用场景. 二、ElasticSearch 基础概念. 1、ElaticSearch 和 DB 的关系. 2、索引. 3、文档. 4、映射. 三、SpringBoot 项目引入 ElasticSearch 依赖. 1、Maven 引入相关依赖. 2、ElasticSearch 连接配置. 四、索引操作示例. 1、Restful 操作示例. 2、Java 代码示例. 五、文档操作示例. 1、Restful 操作原创 2020-09-13 20:39:35 · 1059 阅读 · 0 评论 -
MySQL如何使用索引
MySQL如何使用索引?索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高 SELECT 操作 性能的最佳途径。 查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那 么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。1.使用索引在 MySQL 中,下列几种情况下有可能使用到索引。 (1)对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用, 举例说明如下。 首先按company_id,moneys的顺序创建一原创 2020-08-24 17:19:17 · 1199 阅读 · 0 评论 -
通过 EXPLAIN 分析低效 SQL的执行计划
1,先看例子每个列的简单解释如下: select_type:表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接 或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或 者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。 table:输出结果集的表。 type:表示表的连接类型,性能由好到差的连接类型为 system(表中仅有一行,即 常量表)、const(单表中最多有一个匹配行,例如 primary key原创 2020-08-24 16:29:30 · 240 阅读 · 0 评论 -
ElasticSearch常用Api详解
1 ,检查所有的节点是否已经加入集群http://localhost:9200/_cat/healthhttp://localhost:9200/_cat/nodes2,集群的恢复情况http://localhost:9200/_cat/recovery3,时间参数的URL ,URL编码问题将/转换为%2F//shop_202004 http://localhost:920...原创 2020-04-26 09:40:00 · 418 阅读 · 0 评论 -
Oracle创建表空间和表
创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。数据表空间 (Tablespace)存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据。当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件数据表在仓库,我们可能...转载 2019-11-26 09:13:24 · 1502 阅读 · 1 评论 -
Springboot连接数据库配置详细说明
springboot项目数据库连接配置**1,添加两个依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>...原创 2019-11-22 13:16:06 · 10003 阅读 · 0 评论 -
如何解决mysql插入数据乱码问题?
很多项目都使用mysql数据库,访问数据库进行数据的添加和更新的时候可能会出现乱码现象,解决方法:(1)sql编码,无论是什么方式(jdbc,spring,mybatis,hibernate等)连接,都需要设置连接串,就是url,如图设置,加上characterEncoding=utf-8,给数据库说明,我们的sql语句编码格式。(2)数据表及字段编码将表的存储类型,字段的存储类型都设置成...原创 2019-11-22 10:52:11 · 212 阅读 · 0 评论 -
Redis容灾备份
数据备份的原因:磁盘故障, 节点失效, 诸如此类的问题都可能让你的数据消失不见, 不进行备份是非常危险的。备份数据的方式:Redis 对于数据备份是非常友好的, 因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 rena...原创 2019-11-18 15:55:46 · 391 阅读 · 0 评论 -
B树、B+树、B*树
B树B树即B-树,而不是两种树。概念:一棵m阶B树是一棵平衡的m路搜索树。特点:m即所有节点中孩子节点个数的最大值每个非根节点所包含的关键字个数j满足:ceil(m/2) - 1 <= j <= m - 1(ceil为向上取整,即大于该数的最小整数)节点的子节点数会比关键字个数加1根据以上两条可以得出,每个节点最多有m个分支,非根非叶节点至少有ceil(m/2)个分支B...转载 2019-10-21 16:14:27 · 190 阅读 · 0 评论 -
ElasticSearch的Java实现(JestClient)
/** * @author LiHaitao * @description JestClientTest: * @date 2019/7/11 15:18 **/ @SuppressWarnings("all")public class JestClientTest { private JestClient jestClient{ Article artic...原创 2019-07-11 16:53:58 · 680 阅读 · 0 评论 -
ElasticSearch简介
简介ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。Elasticsearch是开源的,在Apache许可条款下的开放...翻译 2019-07-11 13:38:14 · 200 阅读 · 0 评论 -
elasticsearch常用api
1,查看集群状态:windows: http://127.0.0.1:9200/_cat/health?vlinux: curl -XGET 'localhost:9200/_cat/health?v'2.创建索引,并解决创建索引后集群健康问题:windows:http://localhost:9200/index_namelinux: curl -XPUT 'localhost:92...原创 2019-01-30 10:54:09 · 1030 阅读 · 0 评论 -
elasticsearch.yml文件详解
---------------------------------- 集群设置 -----------------------------------集群名称:cluster.name: es-prod 节点类型master和data同时配置会产生一些奇异的效果:1) 当master为false,而data为true时,会对该节点产生严重负荷;2) 当master为true,而dat.........原创 2019-01-30 09:09:37 · 1280 阅读 · 0 评论 -
elasticsearch备份与迁移
集群节点均需以下操作挂载cephmount -t ceph 10.255.228.232:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret创建备份目录(集群需要一个共享目录,采用ceph)[root@test ~]# mkdir /mnt/cephfs/esbak在master节点调整/mnt/ce...原创 2019-01-28 09:46:12 · 632 阅读 · 0 评论