@@ -41,7 +41,7 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
41
41
42
42
- ### ③索引相关的内容(数据库使用中非常关键的技术,合理正确的使用索引可以大大提高数据库的查询性能)
43
43
44
- Mysql索引使用的数据结构主要有BTree索引和哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。
44
+ Mysql索引使用的数据结构主要有 ** BTree索引 ** 和 ** 哈希索引 ** 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。
45
45
46
46
Mysql的BTree索引使用的是B数中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的。
47
47
@@ -57,12 +57,14 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
57
57
58
58
- ### ④查询缓存的使用
59
59
60
- my.cnf加入以下配置,重启Mysql开机查询缓存
60
+ my.cnf加入以下配置,重启Mysql开启查询缓存
61
61
```
62
62
query_cache_type=1
63
63
query_cache_size=600000
64
64
```
65
+
65
66
Mysql执行以下命令也可以开启查询缓存
67
+
66
68
```
67
69
set global query_cache_type=1;
68
70
set global query_cache_size=600000;
@@ -87,7 +89,7 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
87
89
3 . ** 隔离性:** 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
88
90
4 . ** 持久性:** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库 发生故障也不应该对其有任何影响。
89
91
90
- ** 为了达到上述事务特性,数据库定义了几种不同的事务隔离级别:**
92
+ ** 为了达到上述事务特性,数据库定义了几种不同的事务隔离级别:**
91
93
92
94
- ** READ_UNCOMMITTED(未授权读取):** 最低的隔离级别,允许读取尚未提交的数据变更,** 可能会导致脏读、幻读或不可重复读**
93
95
- ** READ_COMMITTED(授权读取):** 允许读取并发事务已经提交的数据,** 可以阻止脏读,但是幻读或不可重复读仍有可能发生**
@@ -100,7 +102,7 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
100
102
101
103
详细内容可以参考: [ 可能是最漂亮的Spring事务管理详解] ( https://blog.csdn.net/qq_34337272/article/details/80394121 )
102
104
103
- - ### ⑥锁机制
105
+ - ### ⑥锁机制与InnoDB锁算法
104
106
** MyISAM和InnoDB存储引擎使用的锁:**
105
107
106
108
- MyISAM采用表级锁(table-level locking)。
@@ -114,8 +116,21 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
114
116
详细内容可以参考:
115
117
[ Mysql锁机制简单了解一下] ( https://blog.csdn.net/qq_34337272/article/details/80611486 )
116
118
117
- - ### ⑦大表优化
118
- 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
119
+ ** InnoDB存储引擎的锁的算法有三种:**
120
+ - Record lock:单个行记录上的锁
121
+ - Gap lock:间隙锁,锁定一个范围,不包括记录本身
122
+ - Next-key lock:record+gap 锁定一个范围,包含记录本身
123
+
124
+ ** 相关知识点:**
125
+ 1 . innodb对于行的查询使用next-key lock
126
+ 2 . Next-locking keying为了解决Phantom Problem幻读问题
127
+ 3 . 当查询的索引含有唯一属性时,将next-key lock降级为record key
128
+ 4 . Gap锁设计的目的是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生
129
+ 5 . 有两种方式显式关闭gap锁:(除了外键约束和唯一性检查外,其余情况仅使用record lock) A. 将事务隔离级别设置为RC B. 将参数innodb_locks_unsafe_for_binlog设置为1
130
+
131
+ - ### ⑦大表优化
132
+
133
+ 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
119
134
120
135
1 . ** 限定数据的范围:** 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
121
136
2 . ** 读/写分离:** 经典的数据库拆分方案,主库负责写,从库负责读;
@@ -148,6 +163,13 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
148
163
- ** 客户端代理:** ** 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。** 当当网的 ** Sharding-JDBC** 、阿里的TDDL是两种比较常用的实现。
149
164
- ** 中间件代理:** ** 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。** 我们现在谈的 ** Mycat** 、360的Atlas、网易的DDB等等都是这种架构的实现。
150
165
166
+
151
167
详细内容可以参考:
152
168
[ MySQL大表优化方案] ( https://segmentfault.com/a/1190000006158186 )
153
169
170
+ > 欢迎关注我的微信公众号:"** Java面试通关手册** "(一个有温度的微信公众号,无广告,单纯技术分享,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源。)
171
+
172
+ 最后,就是使用阿里云服务器一段时间后,感觉阿里云真的很不错,就申请做了阿里云大使,然后这是[ 我的优惠券地址] ( https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=hf47liqn&utm_source=hf47liqn ) .
173
+
174
+
175
+ ![ 我的公众号] ( https://user-gold-cdn.xitu.io/2018/5/25/16396cf05d1f4fbf?w=180&h=234&f=png&s=28541 )
0 commit comments