myql explain sql分析详解

Explain 命令中的 type 列,显示MySQL查询所使用的 关联类型(Join Types) 或者 访问类型,它表明 MySQL决定如何查找表中符合条件的行
常见访问类型性能由最差到最优依次为:ALL < index < range < index_subquery < unique_subquery < index_merge < ref_or_null < fulltext < ref < eq_ref < const < system

0、测试环境简述

本文 MySQL 实例版本为 5.7,表存储引擎为 InnoDB

数据库 t 中有两张表 useruser_captcha,每张表中有2W+条数据,下面是两张表的建表语句(表结构只为满足实验要求,没有实际业务逻辑参考价值):

user 表
  • id 字段是主键
  • email 字段建立了唯一索引
  • phonecountry_code 字段组成联合唯一索引
  • birth_yeargender 字段组成联合普通索引
  • nickname 字段前10个字符建立了普通索引
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`nickname` varchar(255) DEFAULT NULL,`country_code` smallint(6) unsigned NOT NULL DEFAULT '0',`phone` varchar(12) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',`email` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,`gender` tinyint(4) DEFAULT NULL,`birth_year` smallint(11) unsigned DEFAULT NULL,`created_at` int(11) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `unq_phone_country_code` (`phone`,`country_code`) USING BTREE,UNIQUE KEY `unq_email` (`email`),KEY `idx_birth_year_gender` (`birth_year`,`gender`) USING BTREE,KEY `idx_nickname` (`nickname`(10))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
user_captcha 表
  • id 字段是主键
  • user_id 字段建立了唯一索引,可以为空
  • receiver 字段建立了唯一索引
CREATE TABLE `user_captcha` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) unsigned DEFAULT NULL,`code` char(6) COLLATE utf8_unicode_ci NOT NULL COMMENT '验证码',`retry_times` int(11) NOT NULL COMMENT '重试次数',`last_request_at` int(11) unsigned DEFAULT NULL COMMENT '最后请求时间',`receiver` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL COMMENT '接收者(手机号或邮箱)',`created_at` int(11) NOT NULL,`expired_at` int(11) NOT NULL COMMENT '过期时间',PRIMARY KEY (`id`),UNIQUE KEY `unq_receiver` (`receiver`) USING BTREE,UNIQUE KEY `unique_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

1. ALL

全表扫描,通常意味着MySQL必须从头到尾扫描整张表,去查找匹配的行的行,性能极差。
但是,如果在查询里使用了 LIMIT n,虽然 type 依然是 ALL,但是MySQL只需要扫描到符合条件的前 n 行数据,就会停止继续扫描

  • 查询昵称中带 字的用户数据,因为使用了前缀模糊匹配,不能命中索引,会导致全表扫描
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname` LIKE '%雪%' LIMIT 1 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 22748filtered: 11.11Extra: Using where
  • 查询根据用户id可以被10整除的用户数据。因为在 = 前的索引列上进行了表达式运算,不能命中索引,会全表扫描。
mysql> EXPLAIN SELECT * FROM `user` WHERE id%10=0 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 22293filtered: 100.00Extra: Using where
1 row in set, 1 warning (0.01 sec)
  • 查询手机号是 18888888888 的用户数据,由于数据表中 phone 字段是字符串类型,而查询时使用了数字类型,会触发隐式类型转换,不会命中索引,因此会全表扫描。
mysql> EXPLAIN SELECT * FROM `user` WHERE phone=18888888888 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ALL
possible_keys: unq_phone_country_codekey: NULLkey_len: NULLref: NULLrows: 22293filtered: 10.00Extra: Using where

2. index

indexALL 一样,也会进行全表扫描,只是MySQL会按索引次序进行全表扫描,而不是直接扫描行数据。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。若是按随机次序访问行,开销将会非常大。

  • 根据出生年分组去重,查询用户数据。
mysql> EXPLAIN SELECT * FROM `user` GROUP BY `birth_year` \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 5ref: NULLrows: 22748filtered: 100.00Extra: NULL

如果在 Extra 列中看到 Using index,说明MySQL正在使用覆盖索引,索引的数据中包含了查询所需的所有字段,因此只需要扫描索引树就能够完成查询任务。它比按索引次序全表扫描的开销要少很多,因为索引树的大小通常要远小于全表数据。

  • 根据出生年分组,查询不同年份出生的用户个数,这里用到了覆盖索引。
mysql> EXPLAIN SELECT `birth_year`,COUNT(*) FROM `user` GROUP BY `birth_year`\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 5ref: NULLrows: 22748filtered: 100.00Extra: Using index
  • 查询用户的id、性别、出生年数据,由于 idx_birth_year_gender 索引中包含 birth_yeargender字段,而 InnoDB的所有索引都包含id字段,不需要回表查询其他数据,因此也能用到覆盖索引。
mysql> EXPLAIN SELECT `id`,`birth_year`,`gender` FROM `user` LIMIT 10 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index
possible_keys: NULLkey: idx_birth_year_genderkey_len: 5ref: NULLrows: 22748filtered: 100.00Extra: Using index
  • 查询表数据总条数,查询数据条数时,InnoDB存储引擎会自动选择最短的索引,通过遍历该索引,就可以计算出数据总条数,不需要回表查询其他数据,因此也能用到覆盖索引。
mysql> EXPLAIN SELECT COUNT(*) FROM user \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index
possible_keys: NULLkey: idx_birth_year_genderkey_len: 5ref: NULLrows: 22748filtered: 100.00Extra: Using index

3. range

范围扫描,就是一个有范围限制的索引扫描,它开始于索引里的某一点,返回匹配这个范围值的行。range 比全索引扫描更高效,因为它用不着遍历全部索引。

范围扫描分为以下两种情况:

  1. 范围条件查询:在 WHERE 子句里带有 BETWEEN><>=<= 的查询。
  2. 多个等值条件查询:使用 IN()OR ,以及使用 like 进行前缀匹配模糊查询。
  • 查询 id >= 1000id < 2000 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `id`>=1000 AND `id`<2000 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: PRIMARYkey: PRIMARYkey_len: 4ref: NULLrows: 8filtered: 100.00Extra: Using where
  • 查询 90后 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` BETWEEN 1990 AND 1999 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 3ref: NULLrows: 150filtered: 100.00Extra: Using index condition
  • 查询昵称以 字开头的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname` LIKE '雪%' \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: idx_nicknamekey: idx_nicknamekey_len: 43ref: NULLrows: 30filtered: 100.00Extra: Using where
  • 分别使用 IN()OR 两种方式查询出生年份在 1990,2000,2010 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` IN (1990,2000,2010) \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 3ref: NULLrows: 41filtered: 100.00Extra: Using index conditionmysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=1990 OR `birth_year`=2000 OR `birth_year`=2010 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 3ref: NULLrows: 41filtered: 100.00Extra: Using index condition

4. index_subquery

index_subquery 替换了以下形式的子查询中的 eq_ref 访问类型,其中 key_column 是非唯一索引。

value IN (SELECT key_column FROM single_table WHERE some_expr)

index_subquery 只是一个索引查找函数,它可以完全替换子查询,提高查询效率。

大多数情况下,使用SELECT子查询时,MySQL查询优化器会自动将子查询优化为联表查询,因此 type 不会显示为 index_subquery

  • 在MySQL查询优化器判定可以对 SELECT 子查询进行优化的情况下,使用子查询联表查询的执行计划是相同的。
mysql> EXPLAIN SELECT code FROM user_captcha LEFT JOIN user ON user.phone=user_captcha.receiver WHERE  phone like '1888%' \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: unq_phone_country_codekey: unq_phone_country_codekey_len: 14ref: NULLrows: 44filtered: 100.00Extra: Using where; Using index
*************************** 2. row ***************************id: 1select_type: SIMPLEtable: user_captchapartitions: NULLtype: eq_ref
possible_keys: unq_receiverkey: unq_receiverkey_len: 257ref: t.user.phonerows: 1filtered: 100.00Extra: Using index conditionmysql> EXPLAIN SELECT code FROM user_captcha WHERE receiver IN (SELECT phone FROM `user` WHERE phone like '1888%') \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: range
possible_keys: unq_phone_country_codekey: unq_phone_country_codekey_len: 14ref: NULLrows: 44filtered: 100.00Extra: Using where; Using index; LooseScan
*************************** 2. row ***************************id: 1select_type: SIMPLEtable: user_captchapartitions: NULLtype: eq_ref
possible_keys: unq_receiverkey: unq_receiverkey_len: 257ref: t.user.phonerows: 1filtered: 100.00Extra: Using index condition
  • 我们可以通过在 UPDATE 语句的执行计划中看到 index_subquery
mysql> EXPLAIN UPDATE user_captcha SET retry_times=1 WHERE receiver IN (SELECT phone FROM `user` WHERE phone like '1888%') \G
*************************** 1. row ***************************id: 1select_type: UPDATEtable: user_captchapartitions: NULLtype: index
possible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 22433filtered: 100.00Extra: Using where
*************************** 2. row ***************************id: 2select_type: DEPENDENT SUBQUERYtable: userpartitions: NULLtype: index_subquery
possible_keys: unq_phone_country_codekey: unq_phone_country_codekey_len: 14ref: funcrows: 1filtered: 100.00Extra: Using where; Using index

5. unique_subquery

unique_subqueryindex_subquery 类似,它替换了以下形式的子查询中的 eq_ref 访问类型,其中 primary_key 可以是主键索引或唯一索引。

value IN (SELECT primary_key FROM single_table WHERE some_expr)

unique_subquery 只是一个索引查找函数,它可以完全替换子查询,提高查询效率。

  • 由于MySQL查询优化器会对 SELECT 子查询进行优化,我们可以在 UPDATE 语句的执行计划中看到 unique_subquery
mysql> EXPLAIN UPDATE user_captcha SET retry_times=1 WHERE user_id IN (SELECT id FROM `user` WHERE phone like '%1888%') \G
*************************** 1. row ***************************id: 1select_type: UPDATEtable: user_captchapartitions: NULLtype: index
possible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 22433filtered: 100.00Extra: Using where
*************************** 2. row ***************************id: 2select_type: DEPENDENT SUBQUERYtable: userpartitions: NULLtype: unique_subquery
possible_keys: PRIMARYkey: PRIMARYkey_len: 4ref: funcrows: 1filtered: 11.11Extra: Using where

6. index_merge

表示出现了索引合并优化,通常是将多个索引字段的范围扫描合并为一个。包括单表中多个索引的交集,并集以及交集之间的并集,但不包括跨多张表和全文索引。
这种优化并非必然发生的,当查询优化器判断优化后查询效率更优时才会进行优化。详情可查看官方文档

  • 查询出生年在 1990,2000,2010 年,或 id<1000 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` IN (1990,2000,2010) OR `id`<1000 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index_merge
possible_keys: PRIMARY,idx_birth_year_genderkey: idx_birth_year_gender,PRIMARYkey_len: 3,4ref: NULLrows: 46filtered: 100.00Extra: Using sort_union(idx_birth_year_gender,PRIMARY); Using where
  • 查询手机号以 183 开头或 出生年 大于1990 年的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `phone` like '183%' OR `birth_year`>1990 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index_merge
possible_keys: unq_phone_country_code,idx_birth_year_genderkey: unq_phone_country_code,idx_birth_year_genderkey_len: 14,3ref: NULLrows: 1105filtered: 100.00Extra: Using sort_union(unq_phone_country_code,idx_birth_year_gender); Using where
  • 查询出生年在 1990 年或 id=1000 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=1990 OR `id`=1000 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: index_merge
possible_keys: PRIMARY,idx_birth_year_genderkey: idx_birth_year_gender,PRIMARYkey_len: 3,4ref: NULLrows: 11filtered: 100.00Extra: Using sort_union(idx_birth_year_gender,PRIMARY); Using where
1 row in set, 1 warning (0.01 sec)

7. ref_or_null

ref_or_nullref 类似,但是MySQL必须对包含 NULL 值的行就行额外搜索。

  • 查找昵称是 空字符串 ''NULL 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname`='' OR `nickname` IS NULL \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ref_or_null
possible_keys: idx_nicknamekey: idx_nicknamekey_len: 43ref: constrows: 2filtered: 100.00Extra: Using where

8. fulltext

命中全文索引时 typefulltext

9. ref

索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。把它叫做 ref 是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值。

  • 查找出生年在2000年的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=2000 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ref
possible_keys: idx_birth_year_genderkey: idx_birth_year_genderkey_len: 3ref: constrows: 30filtered: 100.00Extra: NULL
  • 查找电话号码是 18888888888 的用户数据,phonecountry_count 联合组成唯一索引 unq_phone_country_codephone 是唯一索引 unq_phone_country_code 的非唯一性前缀。
mysql> EXPLAIN SELECT * FROM `user` WHERE `phone`='18888888888'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ref
possible_keys: unq_phone_country_codekey: unq_phone_country_codekey_len: 14ref: constrows: 1filtered: 100.00Extra: NULL

10. eq_ref

当进行等值联表查询时,联结字段命中主键索引或唯一的非空索引时,将使用 eq_ref
(《高性能MySQL(第3版)》一书中说"使用主键或唯一索引查询时会用 eq_ref",经过反复测试,并查阅MySQL5.6、5.7版本的官方文档,实际上使用主键或唯一索引进行等值条件查询时 type 会显示 const,《高性能MySQL(第3版)》这里应该是只适用于5.5之前的版本。)

  • user_captcha 表作为主表,LEFT JOIN user 表查询用户数据,因为user表中id字段是主键,所以第二行的 user 表的 typeeq_ref
mysql> EXPLAIN SELECT * FROM `user_captcha` LEFT JOIN `user` ON `user`.`id`=`user_captcha`.`user_id` \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: user_captchapartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 22433filtered: 100.00Extra: NULL
*************************** 2. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: eq_ref
possible_keys: PRIMARYkey: PRIMARYkey_len: 4ref: t.user_captcha.user_idrows: 1filtered: 100.00Extra: Using where
2 rows in set, 1 warning (0.01 sec)
  • 当使用 user 表作为主表,LEFT JOIN user_captcha 表时,因为 user_captcha 表中 user_id 字段与 device_id 组成联合唯一索引,user_id 并非独立的唯一索引,所以第二行的 user_captcha 表的 typeref,而并非 eq_ref
mysql> EXPLAIN SELECT * FROM `user` LEFT JOIN `user_captcha` ON `user`.`id`=`user_captcha`.`user_id` \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 22999filtered: 100.00Extra: NULL
*************************** 2. row ***************************id: 1select_type: SIMPLEtable: user_captchapartitions: NULLtype: ref
possible_keys: unique_userkey: unique_userkey_len: 5ref: t.user.idrows: 1filtered: 100.00Extra: Using where

11. const

MySQL 知道查询最多只能匹配到一条符合条件的记录。因为只有一行,所以优化器可以将这一行中的列中的值视为常量。const 表查询非常快,因为它们只读取一次数据行。
通常使用主键或唯一索引进行等值条件查询时会用 const。

  • 使用主键查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `id`=120 \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: const
possible_keys: PRIMARYkey: PRIMARYkey_len: 4ref: constrows: 1filtered: 100.00Extra: NULL
  • 使用唯一索引查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `email`='54222806@qq.com' \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: const
possible_keys: unq_emailkey: unq_emailkey_len: 258ref: constrows: 1filtered: 100.00Extra: NULL
  • 使用联合唯一索引查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `country_code`=86 AND `phone`='18888888888' \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: userpartitions: NULLtype: const
possible_keys: unq_phone_country_codekey: unq_phone_country_codekey_len: 16ref: const,constrows: 1filtered: 100.00Extra: NULL

12. system

官方文档原文是:The table has only one row (= system table). This is a special case of the const join type.
该表只有一行(=系统表)。这是 const 关联类型的特例。

  • 从系统库mysql的系统表 proxies_priv 里查询数据,这里的数据在Mysql服务启动时候已经加载在内存中,不需要进行磁盘IO。
mysql> EXPLAIN SELECT * FROM `mysql`.`proxies_priv` \G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: proxies_privpartitions: NULLtype: system
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 1filtered: 100.00Extra: NULL

参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学期末考试笔记

文章目录 公钥加密之前的部分 (非重点&#xff0c;关注工具怎么用&#xff0c;和性质)一、对称加密 (symmetric ciphers)1. 定义 二、PRG (伪随机数生成器)1. 定义2. 属性 三、语义安全 (Semantic Security)1. one-time key2. 流密码是语义安全的 四、分组密码 (Block Cipher)1…

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…

信创源代码加密的答案:信创沙箱

在信息化与工业化融合创新&#xff08;信创&#xff09;的背景下&#xff0c;企业面临着前所未有的数据安全挑战。SDC沙盒技术以其独特的隔离和保护机制&#xff0c;为信创环境提供了强有力的支持。以下是SDC沙盒在信创支持方面的优势&#xff0c;这些优势体现了其在保护企业数…

Leecode刷题C语言之根据第k场考试的分数排序

执行结果:通过 执行用时和内存消耗如下&#xff1a; int gk 0;int compare(const void* a, const void* b) {int* ua *(int**)a;int* ub *(int**)b;return ub[gk] - ua[gk]; }int** sortTheStudents(int** score, int scoreSize, int* scoreColSize, int k, int* returnSiz…

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法&#xff1a; 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装&#xff0c;官方地址&#xff1a;https://subversion.apache.org/ 2、SVN的使用…

ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关

目录 应用 1&#xff1a;它是相关性还是托布勒第一定律&#xff1f; 应用 2&#xff1a;将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中&#xff0c;我们在新的空间组件实用程序&#xff08;Moran 特征向量&#xff09;工具集中发布了一个新工具 - 从字段过滤空间自相关。…

自定义一个maven骨架 | 最佳实践

自定义一个maven骨架 | 最佳实践 目的&#xff1a;将一个多模块项目的基础结构制作成maven骨架&#xff0c;实现项目的快速构建&#xff0c;风格统一 公司内部会制定自己的规范及包结构。当创建新项目的时候就需要选择骨架&#xff0c;即可生成包结构。 Archetype都为不同类型的…

CTFHUB-web进阶(Bypassdisable_function)

LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…

workman服务端开发模式-GatewayWorker的使用

一、GatewayWorker介绍 Workerman是一个使用PHP开发的高性能组件&#xff0c;用于构建高性能的异步并发TCP、UDP、Unix Socket、HTTP、Websocket服务。 GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架&#xff0c;实现了单发、群发、广播等接口&#xff0c;内置了…

oracle linux8.10+ oracle 23ai安装

介质准备&#xff1a; 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本&#xff0c;本次未使用。 本次是安装了带补丁的版本&#xff1a; Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》&#xff08;A Philosophy of Software Design&#xff09;是一本在软件架构与设计领域颇具影响力的书籍&#xff0c;作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则&#xff0c;汇聚了作者丰富的实战经验与深邃的…

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录&#xff0c;好像和VUE项目打包没什么区别... 用HX打开项目&#xff0c;首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…

项目实战——高并发内存池

一.项目介绍 本项目——高并发内存池&#xff0c;是通过学习并模仿简化 google 的一个开源项目 tcmalloc &#xff0c;全称 Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;模拟实现了一个自己的高并发内存池&#xff0c;用于高效的多线程内存管理&#xff…

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

自动驾驶控制算法-横向误差微分方程LQR前馈控制

本文是学习自动驾驶控制算法第六讲 前馈控制与航向误差以及前两节的学习笔记。 1 横向误差微分方程 以规划的轨迹作为自然坐标系&#xff0c;计算自车在轨迹上的投影点&#xff0c;进而计算误差&#xff1a; 如图所示&#xff0c;横向误差为 d d d&#xff0c;航向误差为 θ…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

Google Cloud Kubernetes Anthos是什么,和Istio有什么关联

Google Cloud Platform (GCP) Kubernetes Anthos 是 Google 推出的一种多云管理平台&#xff0c;基于 Kubernetes&#xff0c;旨在帮助企业在多个云环境中管理和运行容器化应用程序。 https://cloud.google.com/blog/topics/hybrid-cloud/5-frequently-asked-questions-about-…

多摩川编码器协议

多摩川编码器是一种常用的绝对值编码器&#xff0c;其协议基于485硬件接口的标准NRZ协议&#xff0c;通讯波特率为固定的2.5Mbps。以下是多摩川编码器协议的详细说明&#xff1a; 硬件接口 多摩川编码器使用RS485接口进行通信&#xff0c;接口定义如下&#xff1a; 5V供电&…

AI新书推荐:深度学习和大模型原理与实践(清华社)

本书简介 在这个信息爆炸、技术革新日新月异的时代&#xff0c;深度学习作为人工智能领域的重要分支&#xff0c;正引领着新一轮的技术革命。《深度学习和大模型原理与实践》一书&#xff0c;旨在为读者提供深度学习及其大模型技术的全面知识和实践应用的指南。 本书特色在于…