Java各类技能知识点学习链接大全:四、数据库Sql,Mysql相关

以下内容大多是学习链接,他人整理,个人收藏以便复习,同时归纳分享出来(如有不妥,原作者可随时联系本人删除,感谢!)

四、数据库Sql,Mysql相关

1、MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)_郭三亿的博客-CSDN博客

2、一张图彻底搞懂MySQL的 explain

mysql - 一张图彻底搞懂MySQL的 explain_个人文章 - SegmentFault 思否

3、select for update使用详解

Select for update使用详解 - 知乎

4、mysql for update 死锁问题:

https://www.jianshu.com/p/2b258bfe00e5(gap锁和排它锁发生的死锁)

我们已经知道,这种情况出现的原因是:两个session同时通过select for update,并且未命中任何记录的情况下,是有可能得到相同gap的锁的(要看where筛选条件是否落在同一个区间。如果上面的案例如果一个session准备插入'6'另一个准备插入'11'

           (上面文章没有这个值,假设表里面有 id =12的值,插入11,就在10~12直接有一个gap锁,不会跟6的gap锁产生冲突                   了)则不会出现冲突,因为不是同一个gap)。

 此时再进行并发插入,其中一个会进入锁等待,待第二个session进行插入时,会出现死锁。MySQL会根据事务权重选择一个事务进行回滚。

那么如何避免这个情况呢?
一种解决办法是将事务隔离级别降低到Read Committed,这时不会有gap锁,对于上述场景,如果where中条件不同即最终要插入的键不同,则不会有问题。如果业务代码中可能不同线程会尝试对相同键进行select for update,则可在业务代码中捕获索引冲突异常进行重试。
此外,上面代码示例中的代码还有一处值得注意的地方是事务注解@Transactional的传播机制,对于这类与主流程事务关系不大的方法,应当将事务传播行为改为REQUIRES_NEW。
原因有两点:

因为这里的解决方案是对隔离级别降级,如果传播行为仍然是默认的话,在外层事务隔离级别不是RC的情况下,会抛出IllegalTransactionStateException异常(在你的TransactionManager开启了validateExistingTransaction校验的情况下)。
如果加入外层事务的话,某个线程在执行获取流水号的时候可能会因为另一个线程的与流水号不相关的事务代码还没执行完毕而阻塞。

5、剖析6个MySQL死锁案例的原因以及死锁预防策略

剖析6个MySQL死锁案例的原因以及死锁预防策略 - 掘金

6、MySQL的四种事务隔离级别

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

MySQL的四种事务隔离级别 - 花弄影 - 博客园

彻底搞懂 MySQL 事务的隔离级别-阿里云开发者社区

7、查询使用limit的优化:在MySQL中如何使用覆盖索引优化limit分页查询

如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作。

简单的说,覆盖索引覆盖所有需要查询的字段(即,大于或等于所查询的字段)。MySQL可以通过索引获取查询数据,因而不需要读取数据行。

(1)索引大小远小于数据行大小。因而,如果只读取索引,则能极大减少对数据访问量。
(2)索引按顺序储存。对于IO密集型的范围查询会比随机从磁盘读取每一行数据的IO要少。
(3)避免对主键索引的二次查询。二级索引的叶子节点包含了主键的值,如果二级索引包含所要查询的值,则能避免二次查询主键索引(聚簇索引,聚簇索引既存储了索引,也储存了值)。

https://www.jianshu.com/p/c6290e65d8b5

8、MySQL索引背后的数据结构及算法原理

CodingLabs - MySQL索引背后的数据结构及算法原理

9、Innodb中的事务隔离级别和锁的关系(美团技术博客)

Innodb中的事务隔离级别和锁的关系 - 美团技术团队

10、MySQL索引原理及慢查询优化(美团技术博客)

MySQL索引原理及慢查询优化 - 美团技术团队

11、MyBatis 如何实现流式查询

java - MyBatis 如何实现流式查询_个人文章 - SegmentFault 思否

12、DB主从一致性架构优化4种方法

DB主从一致性架构优化4种方法

13、数据库读写分离,主从同步实现方法:

数据库读写分离,主从同步实现方法_小小程序汪的博客-CSDN博客_数据库读写

Mysql主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案_Data_IT_Farmer的博客-CSDN博客_mysql主从同步原理

mysql数据库的主从同步,实现读写分离_叶梦_的博客-CSDN博客_主从同步读写分离

14、mysql 的binlog介绍:

binlog介绍 - 芹溪 - 博客园

15、分库分表技术演进:

分库分表技术演进&最佳实践-修订篇

16、分布式事务以及解决方案的详解:(本地硬盘资料)

https://www.bilibili.com/video/BV1FJ411A7mV?p=6(哔哩哔哩视频)

三种方案:2PC/XA方案、TCC强一致性方案、可靠消息最终一致性方案:

Mysql,通过XA事务可以来支持分布式事务的实现,在使用分布式事务时,InnoDB存储引擎必须使用SERIALIZABLE的隔离级别,查看是否启用了XA事务支持(默认开启)

mysql> show variables like 'innodb_support_xa';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| innodb_support_xa | ON    |
+-------------------+-------+

XA规范的基础是两阶段提交协议(2PC)。TCC事务处理流程和 2PC二阶段提交类似,不过2PC通常都是在跨库的DB层面,而TCC本质就是一个应用层面的2PC

         前两种方案链接:参考链接:https://www.jianshu.com/p/ee4071d0c951

         可靠消息最终一致性方案:
基于 MQ 来实现事务。比如阿里的 RocketMQ 就支持消息事务。大概的意思就是:

A 系统先发送一个 prepared 消息到 MQ,如果这个 prepared 消息发送失败那么就直接取消操作别执行了;
如果这个消息发送成功过了,那么接着执行本地事务,如果成功就告诉 MQ 发送确认消息,如果失败就告诉 MQ 回滚消息;
如果发送了确认消息,那么此时 B 系统会接收到确认消息,然后执行本地的事务;
mq 会自动定时轮询所有 prepared 消息回调你的接口,问你,这个消息是不是本地事务处理失败了,所有没发送确认的消息,是继续重试还是回滚?一般来说这里你就可以查下数据库看之前本地事务是否执行,如果回滚了,那么这里也回滚吧。这个就是避免可能本地事务执行成功了,而确认消息却发送失败了。
这个方案里,要是系统 B 的事务失败了咋办?重试咯,自动不断重试直到成功,如果实在是不行,要么就是针对重要的资金类业务进行回滚,比如 B 系统本地回滚后,想办法通知系统 A 也回滚;或者是发送报警由人工来手工回滚和补偿。
这个还是比较合适的,目前国内互联网公司大都是这么玩儿的,要不你举用 RocketMQ 支持的,要不你就自己基于类似 ActiveMQ?RabbitMQ?自己封装一套类似的逻辑出来,总之思路就是这样子的。

最大努力通知方案
这个方案的大致意思就是:

系统 A 本地事务执行完之后,发送个消息到 MQ;
这里会有个专门消费 MQ 的最大努力通知服务,这个服务会消费 MQ 然后写入数据库中记录下来,或者是放入个内存队列也可以,接着调用系统 B 的接口;
要是系统 B 执行成功就 ok 了;要是系统 B 执行失败了,那么最大努力通知服务就定时尝试重新调用系统 B,反复 N 次,最后还是不行就放弃。

seata分布式事务的坑:SpringBoot+Dubbo+Seata分布式事务实战 - 掘金

SpringCloud +Seata 实现分布式事务,Nacos 为配置中心:SpringCloud +Seata 实现分布式事务,Nacos 为配置中心_小蛐儿的和弦的博客-CSDN博客

Seata实战-分布式事务简介及demo上手: Seata实战-分布式事务简介及demo上手_hosaos的博客-CSDN博客_分布式事务seata

17、分库分表介绍:

Java面试突击系列(十二):数据库分库分表的面试连环炮_Hi丶ImViper的博客-CSDN博客

18、sharding-jdbc介绍:

分库分表神器 Sharding-JDBC,几千万的数据你不搞一下? - 知乎

概览 :: ShardingSphere

19、大众点评订单系统分库分表实践(美团技术博客)

大众点评订单系统分库分表实践 - 美团技术团队

20、理解MYSQL MVCC 实现机制

mysql的MVCC是为了保证读写之间没有锁的竞争,提高性能;

快照读,是使用MVCC实现的;

当前读,使用next-key-lock,行锁间隙锁实现;

 视频理解:阿里P7要求这么低吗?老哥给你讲清楚什么是MySQL的MVCC_哔哩哔哩_bilibili

【MySQL笔记】正确的理解MySQL的MVCC及实现原理_SnailMann的博客-CSDN博客_mvcc

MySQL - 多版本控制 MVCC 机制初探 - 腾讯云开发者社区-腾讯云

全网最全的一篇数据库MVCC详解,不全我负责-mysql教程-PHP中文网

21、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的:

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

在如下表所示的例子中,表tab_with_index的 id字段有索引,name字段没有索引
mysql> alter table tab_with_index drop index name;
Query OK, 4 rows affected (0.22 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> insert into tab_with_index  values(1,'4');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tab_with_index where id = 1;
+------+------+
| id   | name |
+------+------+
| 1    | 1    |
| 1    | 4    |
+------+------+
2 rows in set (0.00 sec)
   InnoDB存储引擎使用相同索引键的阻塞例子       



(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。
在如下表所示的例子中,表tab_with_index的 id字段有主键索引,name字段有普通索引
mysql> alter table tab_with_index add index name(name);
Query OK, 5 rows affected (0.23 sec)
Records: 5  Duplicates: 0  Warnings: 0
 

即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。

原文链接:https://blog.csdn.net/mysteryhaohao/article/details/51669741

22、Mysql索引总结:

MySQL索引总结 - 知乎

23、Mysql的覆盖索引与回表:

MySQL 的覆盖索引与回表 - 知乎

https://www.jianshu.com/p/d0d3de6832b9

24、聚簇索引与非聚簇索引(也叫二级索引)

https://www.jianshu.com/p/fa8192853184

25、mysql索引面试题

Mysql索引面试题(精品) - 知乎

MySQL数据库索引面试题(最新版) - 知乎

26、Mysql order by与limit混用陷阱

原因:当order by中的列具有相同的值时,每次查询到的顺序存在不一致的现象;

当使用explain执行计划的时候:

Using temporary表示由于排序没有走索引,因此创建了一个内部临时表。注意这里的临时表可能是内存上的临时表,也有可能是硬盘上的临时表。
Using filesort表示没有使用索引排序,它并不意味着在硬盘上排序,filesort与文件无关。消除Using filesort的方法就是让查询sql的排序走索引。

数据库order by排序不唯一,会导致最终的数据排序是不是稳定的 ,
建议在 order by 最后,增加 PK 列或 ROWID,rowid还能增加查询效率!

Mysql order by与limit混用陷阱_丘八老爷的博客-CSDN博客

mysql排序不稳定问题_grant167的博客-CSDN博客

https://www.jianshu.com/p/8c2154872f83

27、mysql查询的时候默认排序

mysql查询的时候默认排序不是主键自增的顺序?_风神幻龙的博客-CSDN博客

mysql、oracle默认排序方法 - 不指定order by_changerzhuo的博客-CSDN博客

28、mysql索引失效场景:

MySQL高级 之 索引失效与优化详解_走慢一点点的博客-CSDN博客_mysql索引失效

29、mysql优化小建议:

常见Mysql的慢查询优化方式_夏至&未至的博客-CSDN博客_mysql慢查询排查方法

mysql千万级大数据SQL查询优化_想跌破记忆寻找你的博客-CSDN博客_大数据查询

30、一次mysql千万级数据量优化:

MYSQL一次千万级连表查询优化(一)_Tim_PHPer的博客-CSDN博客_mysql大表查询

31、B-tree和B+tree的理解:

从B树、B+树、B*树谈到R 树_v_JULY_v的博客-CSDN博客_b树是什么

平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了 - 知乎

漫画:什么是B+树? - 知乎

32、sql执行解析顺序:

关于sql和MySQL的语句执行顺序(必看)_猪哥66的博客-CSDN博客_sql执行顺序优先级

33、mysql索引最左匹配原则的理解

mysql索引最左匹配原则的理解_萝卜头LJW的博客-CSDN博客_mysql索引最左匹配原则

34、【数据库基础】联合索引是什么?为什么要用它?用它时要注意什么?

【数据库基础】联合索引是什么?为什么要用它?用它时要注意什么?_转身雪人的博客-CSDN博客_联合索引

35、开源数据同步神器——canal

开源数据同步神器——canal - IT米粉 - 博客园

史上最全的分布式数据同步中间间canal 之入门篇 - 知乎

36、Mysql-Limit 优化   百万级,千万级

Mysql-Limit 优化 - 小白个人成长记 - 博客园

37、Mysql 分页语句 Limit原理

Mysql 分页语句 Limit原理_Data_IT_Farmer的博客-CSDN博客

38、LEFT JOIN关联表中ON,WHERE后面跟条件的区别

LEFT JOIN关联表中ON,WHERE后面跟条件的区别_jcpp9527的博客-CSDN博客_左关联时条件放on后和放where后的区别

SQL JOIN 中 on 与 where 的区别 | 菜鸟教程

39、为什么mysql数据库字段要定义为NOT NULL

MySQL 中NULL和空值的区别,索引列是否可空值或null_Nancy_1998的博客-CSDN博客_索引字段可以为null吗

为什么数据库字段要使用NOT NULL?_架构师小秘圈的博客-CSDN博客

40、数据库分库分表策略和分库分表后数据的查询

数据库分库分表策略和分库分表后数据的查询_孜梓不倦的博客-CSDN博客_分库分表查询

mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?_do better myself的博客-CSDN博客_分库分表后怎么分页

41、数据库连接池学习笔记(一):原理介绍+常用连接池介绍:

数据库连接池学习笔记(一):原理介绍+常用连接池介绍_CrankZ的博客-CSDN博客_连接数据池

42、mysql int 类型的长度值问题

https://www.jianshu.com/p/febf5bd2bd37

MySQL中int(11)最大长度是多少?_阳光温暖的博客-CSDN博客_int(11)最大值

43、【MySQL】20个经典面试题

【MySQL】20个经典面试题,全部答对月薪10k+_烫潑哋媔條的博客-CSDN博客

44、mysql面试题整理(ThinkWon博客)

MySQL数据库面试题(2020最新版)_ThinkWon的博客-CSDN博客_mysql 面试

45、mysql  null 字段查询问题

MySQL为Null会导致5个问题,个个致命! - 知乎

MySQL为Null会导致5个问题,个个致命!-51CTO.COM(同上)

46、MySQL字段 不推荐使用 Null 的理由

Mysql官方文档对于null字段的一个说明。

NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.

《高性能mysql第二版》中也提到,Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYISAM中固定大小的索引变成可变大小的索引。

MySQL字段 不推荐使用 Null 的理由_georgesnoopy的博客-CSDN博客

47、MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)即可。MySQL在保存变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节即可。另外还可以使用4个字段分别存储IPv4中的各部分,但是通常这不管是存储空间和查询效率应该都不是很高(可能有的场景适合使用这种方式存储)。

MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换_MikanMu的博客-CSDN博客_mysql存ip地址

48、为什么MySQL设计主键时key不能过长?

https://www.jianshu.com/p/31bfd4ac3e61

49、MySQL的复制原理以及流程

https://www.jianshu.com/p/63c1a1babfd1

50、MySQL中myisam与innodb的区别

https://www.jianshu.com/p/beea4f812b59

51、innodb的事务与日志的实现方式

redo log  undo log  binlog

必须了解的MySQL三大日志:binlog、redo log和undo log - 知乎

【图文详解】MySQL系列之redo log、undo log和binlog详解 - 腾讯云开发者社区-腾讯云

52、MySQL数据库cpu飙升到500%的话他怎么处理?

MySQL数据库cpu飙升到500%的话他怎么处理?_lxw1844912514的博客-CSDN博客

https://www.jianshu.com/p/b5356317beaf

53、sql中的or,哪些场景会导致全表扫描

建议 用  union  all   替代  or

sql中的or,哪些场景会导致全表扫描_knight_hf的博客-CSDN博客

为什么SQL优化中建议用UNION来代替OR - 腾讯云开发者社区-腾讯云

mysql 实战 or、in与union all 的查询效率 - 跳刀的兔子 - 博客园(这个有另外说法)

54、mysql 为什么用  自增主键

(1)、int占用字节更少,节省空间,从而每一页存储的数据节点更多,减少b+tree的层级

(2)、插入的时候:

如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。
如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。
当往一个快满或已满的数据页中插入数据时,新插入的数据会将数据页写满,mysql 就需要申请新的数据页,并且把上个数据页中的部分数据挪到新的数据页上。
这就造成了页分裂,这个大量移动数据的过程是会严重影响插入效率的。

(3)、在用范围查找语句的时候,int比较大小,比字符串类型效率高;

mysql为什么建议使用自增主键 - 知乎 (zhihu.com)

55、MySQL是如何实现事务的ACID

MySQL是如何实现事务的ACID - 腾讯云开发者社区-腾讯云 (tencent.com)

56、MySQL使用LOAD DATA导入数据

MySQL load data 快速导入大批量数据_极乐谷2-DevPress官方社区 (csdn.net)

57、mysql主从有几个线程

  1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的 binlog中;
  2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
  3. 从:sql执行线程——执行relay log中的语句;

Binary log:主数据库的二进制日志;

Relay log:从服务器的中继日志;

  • redo log:用于保证持久性;
  • undo log:用于保证原子性;
  • bin log:用于保证数据一致性;

58、mysql   分区、分表:

MySQL的四种分区方式 - 业余砖家 - 博客园 (cnblogs.com)

什么是分库分区分表_mischen520的博客-CSDN博客_分库分区

59、mysql高效导入文件到表中方案:

LOAD DATA INFILE使用与详解_longzhoufeng-DevPress官方社区 (csdn.net)

60、mysql隐式转换的问题:

https://www.cnblogs.com/guitu18/p/12113495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值