Merge c9b5e08fe8a400a771c1370c9f849711c38777fd into ce3090d8b08b1435826defcd03919805a5332ed9
This commit is contained in:
commit
af8a66cd6c
@ -757,7 +757,7 @@ System.out.println(set.size()); // 2
|
|||||||
|
|
||||||
理想的哈希函数应当具有均匀性,即不相等的对象应当均匀分布到所有可能的哈希值上。这就要求了哈希函数要把所有域的值都考虑进来。可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。
|
理想的哈希函数应当具有均匀性,即不相等的对象应当均匀分布到所有可能的哈希值上。这就要求了哈希函数要把所有域的值都考虑进来。可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。
|
||||||
|
|
||||||
R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,最左边的位丢失。并且一个数与 31 相乘可以转换成移位和减法:`31*x == (x<<5)-x`,编译器会自动进行这个优化。
|
R 一般取 31,因为它是一个奇数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,最左边的位丢失。并且一个数与 31 相乘可以转换成移位和减法:`31*x == (x<<5)-x`,编译器会自动进行这个优化。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@Override
|
@Override
|
||||||
|
@ -236,7 +236,7 @@ epoll 仅适用于 Linux OS。
|
|||||||
|
|
||||||
epoll 比 select 和 poll 更加灵活而且没有描述符数量限制。
|
epoll 比 select 和 poll 更加灵活而且没有描述符数量限制。
|
||||||
|
|
||||||
epoll 对多线程编程更有友好,一个线程调用了 epoll_wait() 另一个线程关闭了同一个描述符也不会产生像 select 和 poll 的不确定情况。
|
epoll 对多线程编程更友好,一个线程调用了 epoll_wait() 另一个线程关闭了同一个描述符也不会产生像 select 和 poll 的不确定情况。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// Create the epoll descriptor. Only one is needed per app, and is used to monitor all sockets.
|
// Create the epoll descriptor. Only one is needed per app, and is used to monitor all sockets.
|
||||||
|
@ -293,7 +293,7 @@ MVCC 维护了一个 ReadView 结构,主要包含了当前系统未提交的
|
|||||||
|
|
||||||
在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用:
|
在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用:
|
||||||
|
|
||||||
- TRX_ID < TRX_ID_MIN,表示该数据行快照时在当前所有未提交事务之前进行更改的,因此可以使用。
|
- TRX_ID < TRX_ID_MIN,表示该数据行快照是在当前所有未提交事务之前进行更改的,因此可以使用。
|
||||||
|
|
||||||
- TRX_ID > TRX_ID_MAX,表示该数据行快照是在事务启动之后被更改的,因此不可使用。
|
- TRX_ID > TRX_ID_MAX,表示该数据行快照是在事务启动之后被更改的,因此不可使用。
|
||||||
- TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断:
|
- TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断:
|
||||||
|
@ -690,7 +690,7 @@ after
|
|||||||
|
|
||||||
## 阻塞(BLOCKED)
|
## 阻塞(BLOCKED)
|
||||||
|
|
||||||
请求获取 monitor lock 从而进入 synchronized 函数或者代码块,但是其它线程已经占用了该 monitor lock,所以出于阻塞状态。要结束该状态进入从而 RUNABLE 需要其他线程释放 monitor lock。
|
请求获取 monitor lock 从而进入 synchronized 函数或者代码块,但是其它线程已经占用了该 monitor lock,所以出于阻塞状态。要结束该状态从而进入RUNABLE 需要其他线程释放 monitor lock。
|
||||||
|
|
||||||
## 无限期等待(WAITING)
|
## 无限期等待(WAITING)
|
||||||
|
|
||||||
@ -1567,7 +1567,7 @@ public static String concatString(String s1, String s2, String s3) {
|
|||||||
|
|
||||||
如果一系列的连续操作都对同一个对象反复加锁和解锁,频繁的加锁操作就会导致性能损耗。
|
如果一系列的连续操作都对同一个对象反复加锁和解锁,频繁的加锁操作就会导致性能损耗。
|
||||||
|
|
||||||
上一节的示例代码中连续的 append() 方法就属于这类情况。如果虚拟机探测到由这样的一串零碎的操作都对同一个对象加锁,将会把加锁的范围扩展(粗化)到整个操作序列的外部。对于上一节的示例代码就是扩展到第一个 append() 操作之前直至最后一个 append() 操作之后,这样只需要加锁一次就可以了。
|
上一节的示例代码中连续的 append() 方法就属于这类情况。如果虚拟机探测到有这样的一串零碎的操作都对同一个对象加锁,将会把加锁的范围扩展(粗化)到整个操作序列的外部。对于上一节的示例代码就是扩展到第一个 append() 操作之前直至最后一个 append() 操作之后,这样只需要加锁一次就可以了。
|
||||||
|
|
||||||
## 轻量级锁
|
## 轻量级锁
|
||||||
|
|
||||||
|
@ -161,7 +161,13 @@ customer_id_selectivity: 0.0373
|
|||||||
|
|
||||||
### 4. 前缀索引
|
### 4. 前缀索引
|
||||||
|
|
||||||
对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。
|
对于BLOB和TEXT这种文本类型的列,必须使用前缀索引,在创建索引时必须使用col_name(N)来指定索引的前缀长度(键长度),从而只索引开始的部分字符。
|
||||||
|
```sql
|
||||||
|
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
|
||||||
|
```
|
||||||
|
https://dev.mysql.com/doc/refman/5.7/en/column-indexes.html#column-indexes-prefix
|
||||||
|
|
||||||
|
对于VARCHAR和CHAR类型的列,不强制要求使用前缀索引,根据业务自行选择即可
|
||||||
|
|
||||||
前缀长度的选取需要根据索引选择性来确定。
|
前缀长度的选取需要根据索引选择性来确定。
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user