diff --git a/docs/notes/Leetcode-Database 题解.md b/docs/notes/Leetcode-Database 题解.md index ef28891a..4a94bccb 100644 --- a/docs/notes/Leetcode-Database 题解.md +++ b/docs/notes/Leetcode-Database 题解.md @@ -118,6 +118,13 @@ VALUES ## Solution +使用异或操作,两个相等的数异或的结果为 0,而 0 与任何一个数异或的结果为这个数。 + +``` +'f' ^ 'm' ^ 'f' = 'm' +'m' ^ 'm' ^ 'f' = 'f' +``` + ```sql UPDATE salary SET sex = CHAR ( ASCII(sex) ^ ASCII( 'm' ) ^ ASCII( 'f' ) ); @@ -237,6 +244,8 @@ VALUES ## Solution +对 class 列进行分组之后,再使用 count 汇总函数统计数量,统计之后使用 having 进行过滤。 + ```sql SELECT class diff --git a/docs/notes/MySQL.md b/docs/notes/MySQL.md index 59839232..afc56988 100644 --- a/docs/notes/MySQL.md +++ b/docs/notes/MySQL.md @@ -62,7 +62,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具 (二)利用磁盘预读特性 -为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,速度会非常快。 +为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的磁盘旋转时间,速度会非常快。 操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入。 @@ -76,7 +76,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具 因为不再需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。 -除了用于查找,还可以用于排序和分组。 +因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。 可以指定多个列作为索引列,多个索引列共同组成键。 @@ -140,7 +140,7 @@ WHERE actor_id = 1 AND film_id = 1; 让选择性最强的索引列放在前面。 -索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,查询效率也越高。 +索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高。 例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。 @@ -161,7 +161,7 @@ customer_id_selectivity: 0.0373 对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。 -对于前缀长度的选取需要根据索引选择性来确定。 +前缀长度的选取需要根据索引选择性来确定。 ### 5. 覆盖索引 @@ -177,7 +177,7 @@ customer_id_selectivity: 0.0373 - 大大减少了服务器需要扫描的数据行数。 -- 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,因为不需要排序和分组,也就不需要创建临时表)。 +- 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)。 - 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)。 @@ -328,7 +328,7 @@ MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 它与时区无关。 -默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 +默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 ### 2. TIMESTAMP @@ -390,7 +390,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 - **binlog 线程** :负责将主服务器上的数据更改写入二进制日志(Binary log)中。 - **I/O 线程** :负责从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log)。 -- **SQL 线程** :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中执行。 +- **SQL 线程** :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。

diff --git a/docs/notes/SQL.md b/docs/notes/SQL.md index 3d093a7f..44f0b945 100644 --- a/docs/notes/SQL.md +++ b/docs/notes/SQL.md @@ -30,7 +30,7 @@ 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。 -主键的值不允许修改,也不允许复用(不能使用已经删除的主键值赋给新数据行的主键)。 +主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。 @@ -57,10 +57,15 @@ USE test; ```sql CREATE TABLE mytable ( + # int 类型,不为空,自增 id INT NOT NULL AUTO_INCREMENT, + # int 类型,不可为空,默认值为 1,不为空 col1 INT NOT NULL DEFAULT 1, + # 变长字符串类型,最长为 45 个字符,可以为空 col2 VARCHAR(45) NULL, + # 日期类型,可为空 col3 DATE NULL, + # 设置主键为 id PRIMARY KEY (`id`)); ``` @@ -268,7 +273,7 @@ FROM mytable; AVG() 会忽略 NULL 行。 -使用 DISTINCT 可以让汇总函数值汇总不同的值。 +使用 DISTINCT 可以汇总不同的值。 ```sql SELECT AVG(DISTINCT col1) AS avg_col @@ -346,7 +351,7 @@ mysql> SELECT NOW(); # 十三、分组 -分组就是把具有相同的数据值的行放在同一组中。 +把具有相同的数据值的行放在同一组中。 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。 @@ -434,8 +439,6 @@ FROM tablea AS A, tableb AS B WHERE A.key = B.key; ``` -在没有条件语句的情况下返回笛卡尔积。 - ## 自连接 自连接可以看成内连接的一种,只是连接的表是自身而已。 @@ -660,7 +663,7 @@ MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储 MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。 -通过设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。 +设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。 如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。 @@ -757,7 +760,7 @@ REVOKE SELECT, INSERT ON mydatabase.* FROM myuser; **更改密码** -必须使用 Password() 函数 +必须使用 Password() 函数进行加密。 ```sql SET PASSWROD FOR myuser = Password('new_password'); diff --git a/docs/notes/缓存.md b/docs/notes/缓存.md index 9187dba9..b2ac9eaf 100644 --- a/docs/notes/缓存.md +++ b/docs/notes/缓存.md @@ -193,15 +193,14 @@ public class LRU implements Iterable { MySQL 等数据库管理系统具有自己的查询缓存机制来提高查询效率。 -## Java 内部的缓存 +## Java 内部的缓存 Java 为了优化空间,提高字符串、基本数据类型包装类的创建效率,设计了字符串常量池及 Byte、Short、Character、Integer、Long、Boolean 这六种包装类缓冲池。 -## CPU 多级缓存 +## CPU 多级缓存 CPU 为了解决运算速度与主存 IO 速度不匹配的问题,引入了多级缓存结构,同时使用 MESI 等缓存一致性协议来解决多核 CPU 缓存数据一致性的问题。 - # 四、CDN 内容分发网络(Content distribution network,CDN)是一种互连的网络系统,它利用更靠近用户的服务器从而更快更可靠地将 HTML、CSS、JavaScript、音乐、图片、视频等静态资源分发给用户。 @@ -237,6 +236,7 @@ CDN 主要有以下优点: - 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。 - 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。 + ## 缓存一致性 缓存一致性要求数据更新的同时缓存数据也能够实时更新。 @@ -248,20 +248,17 @@ CDN 主要有以下优点: 要保证缓存一致性需要付出很大的代价,缓存数据最好是那些对一致性要求不高的数据,允许缓存数据存在一些脏数据。 -## 缓存“无底洞”现象 +## 缓存 “无底洞” 现象 -指的是为了满足业务要求添加了大量缓存节点, 但是性能不但没有好转反而下降了的现象。 +指的是为了满足业务要求添加了大量缓存节点,但是性能不但没有好转反而下降了的现象。 -产生原因:缓存系统通常采用 hash 函数将 key 映射到对应的缓存节点,随着缓存节点数目的增加,键值分布到更多的节点上,导致客户端一次批量操作会涉及多次网络操作,这意味着批量操作的耗时会随 -着节点数目的增加而不断增大。此外,网络连接数变多,对节点的性能也有一定影响。 +产生原因:缓存系统通常采用 hash 函数将 key 映射到对应的缓存节点,随着缓存节点数目的增加,键值分布到更多的节点上,导致客户端一次批量操作会涉及多次网络操作,这意味着批量操作的耗时会随着节点数目的增加而不断增大。此外,网络连接数变多,对节点的性能也有一定影响。 解决方案: - 优化批量数据操作命令; - 减少网络通信次数; -- 降低接入成本,使用长连/连接池,NIO 等。 - - +- 降低接入成本,使用长连接 / 连接池,NIO 等。 # 六、数据分布 diff --git a/notes/Leetcode-Database 题解.md b/notes/Leetcode-Database 题解.md index ef28891a..4a94bccb 100644 --- a/notes/Leetcode-Database 题解.md +++ b/notes/Leetcode-Database 题解.md @@ -118,6 +118,13 @@ VALUES ## Solution +使用异或操作,两个相等的数异或的结果为 0,而 0 与任何一个数异或的结果为这个数。 + +``` +'f' ^ 'm' ^ 'f' = 'm' +'m' ^ 'm' ^ 'f' = 'f' +``` + ```sql UPDATE salary SET sex = CHAR ( ASCII(sex) ^ ASCII( 'm' ) ^ ASCII( 'f' ) ); @@ -237,6 +244,8 @@ VALUES ## Solution +对 class 列进行分组之后,再使用 count 汇总函数统计数量,统计之后使用 having 进行过滤。 + ```sql SELECT class diff --git a/notes/MySQL.md b/notes/MySQL.md index 6dbc2e4d..64e7f6d2 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -62,7 +62,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具 (二)利用磁盘预读特性 -为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,速度会非常快。 +为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的磁盘旋转时间,速度会非常快。 操作系统一般将内存和磁盘分割成固定大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入。 @@ -76,7 +76,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具 因为不再需要进行全表扫描,只需要对树进行搜索即可,所以查找速度快很多。 -除了用于查找,还可以用于排序和分组。 +因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。 可以指定多个列作为索引列,多个索引列共同组成键。 @@ -140,7 +140,7 @@ WHERE actor_id = 1 AND film_id = 1; 让选择性最强的索引列放在前面。 -索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,查询效率也越高。 +索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高。 例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。 @@ -161,7 +161,7 @@ customer_id_selectivity: 0.0373 对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。 -对于前缀长度的选取需要根据索引选择性来确定。 +前缀长度的选取需要根据索引选择性来确定。 ### 5. 覆盖索引 @@ -177,7 +177,7 @@ customer_id_selectivity: 0.0373 - 大大减少了服务器需要扫描的数据行数。 -- 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,因为不需要排序和分组,也就不需要创建临时表)。 +- 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)。 - 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)。 @@ -328,7 +328,7 @@ MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 它与时区无关。 -默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 +默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 ### 2. TIMESTAMP @@ -390,7 +390,7 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 - **binlog 线程** :负责将主服务器上的数据更改写入二进制日志(Binary log)中。 - **I/O 线程** :负责从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log)。 -- **SQL 线程** :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中执行。 +- **SQL 线程** :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。

diff --git a/notes/SQL.md b/notes/SQL.md index 3d093a7f..44f0b945 100644 --- a/notes/SQL.md +++ b/notes/SQL.md @@ -30,7 +30,7 @@ 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。 -主键的值不允许修改,也不允许复用(不能使用已经删除的主键值赋给新数据行的主键)。 +主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。 @@ -57,10 +57,15 @@ USE test; ```sql CREATE TABLE mytable ( + # int 类型,不为空,自增 id INT NOT NULL AUTO_INCREMENT, + # int 类型,不可为空,默认值为 1,不为空 col1 INT NOT NULL DEFAULT 1, + # 变长字符串类型,最长为 45 个字符,可以为空 col2 VARCHAR(45) NULL, + # 日期类型,可为空 col3 DATE NULL, + # 设置主键为 id PRIMARY KEY (`id`)); ``` @@ -268,7 +273,7 @@ FROM mytable; AVG() 会忽略 NULL 行。 -使用 DISTINCT 可以让汇总函数值汇总不同的值。 +使用 DISTINCT 可以汇总不同的值。 ```sql SELECT AVG(DISTINCT col1) AS avg_col @@ -346,7 +351,7 @@ mysql> SELECT NOW(); # 十三、分组 -分组就是把具有相同的数据值的行放在同一组中。 +把具有相同的数据值的行放在同一组中。 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。 @@ -434,8 +439,6 @@ FROM tablea AS A, tableb AS B WHERE A.key = B.key; ``` -在没有条件语句的情况下返回笛卡尔积。 - ## 自连接 自连接可以看成内连接的一种,只是连接的表是自身而已。 @@ -660,7 +663,7 @@ MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储 MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。 -通过设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。 +设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。 如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。 @@ -757,7 +760,7 @@ REVOKE SELECT, INSERT ON mydatabase.* FROM myuser; **更改密码** -必须使用 Password() 函数 +必须使用 Password() 函数进行加密。 ```sql SET PASSWROD FOR myuser = Password('new_password'); diff --git a/notes/缓存.md b/notes/缓存.md index 188fcc88..ce1e15db 100644 --- a/notes/缓存.md +++ b/notes/缓存.md @@ -193,6 +193,14 @@ public class LRU implements Iterable { MySQL 等数据库管理系统具有自己的查询缓存机制来提高查询效率。 +## Java 内部的缓存 + +Java 为了优化空间,提高字符串、基本数据类型包装类的创建效率,设计了字符串常量池及 Byte、Short、Character、Integer、Long、Boolean 这六种包装类缓冲池。 + +## CPU 多级缓存 + +CPU 为了解决运算速度与主存 IO 速度不匹配的问题,引入了多级缓存结构,同时使用 MESI 等缓存一致性协议来解决多核 CPU 缓存数据一致性的问题。 + # 四、CDN 内容分发网络(Content distribution network,CDN)是一种互连的网络系统,它利用更靠近用户的服务器从而更快更可靠地将 HTML、CSS、JavaScript、音乐、图片、视频等静态资源分发给用户。 @@ -228,6 +236,7 @@ CDN 主要有以下优点: - 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。 - 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。 + ## 缓存一致性 缓存一致性要求数据更新的同时缓存数据也能够实时更新。 @@ -239,6 +248,18 @@ CDN 主要有以下优点: 要保证缓存一致性需要付出很大的代价,缓存数据最好是那些对一致性要求不高的数据,允许缓存数据存在一些脏数据。 +## 缓存 “无底洞” 现象 + +指的是为了满足业务要求添加了大量缓存节点,但是性能不但没有好转反而下降了的现象。 + +产生原因:缓存系统通常采用 hash 函数将 key 映射到对应的缓存节点,随着缓存节点数目的增加,键值分布到更多的节点上,导致客户端一次批量操作会涉及多次网络操作,这意味着批量操作的耗时会随着节点数目的增加而不断增大。此外,网络连接数变多,对节点的性能也有一定影响。 + +解决方案: + +- 优化批量数据操作命令; +- 减少网络通信次数; +- 降低接入成本,使用长连接 / 连接池,NIO 等。 + # 六、数据分布 ## 哈希分布