diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index aebd8eea..22c76468 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -757,7 +757,7 @@ System.out.println(set.size()); // 2 理想的哈希函数应当具有均匀性,即不相等的对象应当均匀分布到所有可能的哈希值上。这就要求了哈希函数要把所有域的值都考虑进来。可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。 -R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,最左边的位丢失。并且一个数与 31 相乘可以转换成移位和减法:`31*x == (x<<5)-x`,编译器会自动进行这个优化。 +R 一般取 31,因为它是一个奇数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,最左边的位丢失。并且一个数与 31 相乘可以转换成移位和减法:`31*x == (x<<5)-x`,编译器会自动进行这个优化。 ```java @Override diff --git a/docs/notes/Socket.md b/docs/notes/Socket.md index 6138490c..c5ca24c0 100644 --- a/docs/notes/Socket.md +++ b/docs/notes/Socket.md @@ -236,7 +236,7 @@ epoll 仅适用于 Linux OS。 epoll 比 select 和 poll 更加灵活而且没有描述符数量限制。 -epoll 对多线程编程更有友好,一个线程调用了 epoll_wait() 另一个线程关闭了同一个描述符也不会产生像 select 和 poll 的不确定情况。 +epoll 对多线程编程更友好,一个线程调用了 epoll_wait() 另一个线程关闭了同一个描述符也不会产生像 select 和 poll 的不确定情况。 ```c // Create the epoll descriptor. Only one is needed per app, and is used to monitor all sockets. diff --git a/docs/notes/数据库系统原理.md b/docs/notes/数据库系统原理.md index 485710ea..8b1956a5 100644 --- a/docs/notes/数据库系统原理.md +++ b/docs/notes/数据库系统原理.md @@ -293,7 +293,7 @@ MVCC 维护了一个 ReadView 结构,主要包含了当前系统未提交的 在进行 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_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断: diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 9bdcbb8f..2ba31fb6 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -690,7 +690,7 @@ after ## 阻塞(BLOCKED) -请求获取 monitor lock 从而进入 synchronized 函数或者代码块,但是其它线程已经占用了该 monitor lock,所以出于阻塞状态。要结束该状态进入从而 RUNABLE 需要其他线程释放 monitor lock。 +请求获取 monitor lock 从而进入 synchronized 函数或者代码块,但是其它线程已经占用了该 monitor lock,所以出于阻塞状态。要结束该状态从而进入RUNABLE 需要其他线程释放 monitor lock。 ## 无限期等待(WAITING) @@ -1567,7 +1567,7 @@ public static String concatString(String s1, String s2, String s3) { 如果一系列的连续操作都对同一个对象反复加锁和解锁,频繁的加锁操作就会导致性能损耗。 -上一节的示例代码中连续的 append() 方法就属于这类情况。如果虚拟机探测到由这样的一串零碎的操作都对同一个对象加锁,将会把加锁的范围扩展(粗化)到整个操作序列的外部。对于上一节的示例代码就是扩展到第一个 append() 操作之前直至最后一个 append() 操作之后,这样只需要加锁一次就可以了。 +上一节的示例代码中连续的 append() 方法就属于这类情况。如果虚拟机探测到有这样的一串零碎的操作都对同一个对象加锁,将会把加锁的范围扩展(粗化)到整个操作序列的外部。对于上一节的示例代码就是扩展到第一个 append() 操作之前直至最后一个 append() 操作之后,这样只需要加锁一次就可以了。 ## 轻量级锁 diff --git a/notes/MySQL.md b/notes/MySQL.md index 7d11d49b..63dfd396 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -161,7 +161,13 @@ customer_id_selectivity: 0.0373 ### 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类型的列,不强制要求使用前缀索引,根据业务自行选择即可 前缀长度的选取需要根据索引选择性来确定。