06 mysql all查询 和 主键查询 和 非索引列查询
前言
本文主要调试一下 mysql 的如下两种查询语句
我们也来深入的看一下, 究竟如下两个普通的查询, mysql 做了什么事情
1. select * from `user` where id = '991';
2. select * from `user`;
3. select * from `user` where name = 'jerry991';
环境介绍
测试表 `user` schema 如下
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`age` int(11) DEFAULT '0',`name` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
`user` 表中的测试数据如下
select * from `user` where id = '991'
我们这里会着重介绍这个 case, 这里面会详细的看一下 index page, data page 的情况, 以及其具体的执行的流程
另外这个过程中我们会忽略掉一些细节, 尽量只查看这个业务查询的核心业务流程
获取 index page
index -> page 为 3, 表示第三个 page 为索引页面, pageNo 初始化为 index->page, 该 page 的地址为 block->frame : 0x1217f4000
我们 inspect 一下 0x1217f4000
可以看出 offset 为 3, 对应于上面的 pageNo
pagePrev, pageNext 为 0xffffffff, 表示只有一个索引页面
pageNDirSlots 表示当前 page 存在两个 pageDirectory
pageHeapTop 表示当前页面的 FreeSpace 位于 0xa2
pageNHeap 表示有 5 个元素, 三个索引元素 + infimum + supremum
pageNRecords 表示有三个索引元素
pageLevel 为 1 表示下面一级才是叶子节点[存储数据的节点]
再看下面的索引信息 [1, 302) -> page4, [302, 719) -> page5, [719, supremum] -> page6
(lldb) x 0x1217f4000 -c 0x100
0x1217f4000: c2 b7 03 ad 00 00 00 03 ff ff ff ff ff ff ff ff ·.�....��������
0x1217f4010: 00 00 00 00 00 1d 34 e5 45 bf 00 00 00 00 00 00 ......4�E�......
0x1217f4020: 00 00 00 00 00 06 00 02 00 a2 80 05 00 00 00 00 .........�......
0x1217f4030: 00 9a 00 02 00 02 00 03 00 00 00 00 00 00 00 00 ................
0x1217f4040: 00 01 00 00 00 00 00 00 00 16 00 00 00 06 00 00 ................
0x1217f4050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00 ...�.........2..
0x1217f4060: 02 00 1b 69 6e 66 69 6d 75 6d 00 04 00 0b 00 00 ...infimum......
0x1217f4070: 73 75 70 72 65 6d 75 6d 00 10 00 11 00 0e 80 00 supremum........
0x1217f4080: 00 01 00 00 00 04 00 00 00 19 00 0e 80 00 01 2e ................
0x1217f4090: 00 00 00 05 00 00 00 21 ff d6 80 00 02 cf 00 00 .......!��...�..
0x1217f40a0: 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x1217f40b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x1217f40c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x1217f40d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x1217f40e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x1217f40f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................# FileHeader
FIL_PAGE_SPACE = c2 b7 03 ad
FIL_PAGE_OFFSET = 00 00 00 03
FIL_PAGE_PREV = ff ff ff ff
FIL_PAGE_NEXT = ff ff ff ff
FIL_PAGE_LSN = 00 00 00 00 00 1d 34 e5
FIL_PAGE_TYPE = 45 bf
FIL_PAGE_FILE_FLUSH_LSN = 00 00 00 00 00 00 00 00
FIL_PAGE_ARCH_LOG_NO = 00 00 00 06 # PageHeader
PAGE_N_DIR_SLOTS = 00 02
PAGE_HEAP_TOP = 00 a2
PAGE_N_HEAP = 80 05
PAGE_FREE = 00 00
PAGE_GARBAGE = 00 00
PAGE_LAST_INSERT = 00 9a
PAGE_DIRECTION = 00 02
PAGE_N_DIRECTION = 00 02
PAGE_N_RECS = 00 03
PAGE_MAX_TRX_ID = 00 00 00 00 00 00 00 00
PAGE_LEVEL = 00 01
PAGE_INDEX_ID = 00 00 00 00 00 00 00 16
PAGE_BTR_SEG_LEAF = 00 00 00 06 00 00 00 02 00 f2
PAGE_BTR_SEG_TOP = 00 00 00 06 00 00 00 02 00 32 # page4
0x 00 = nulls
0x 1 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0001 0 = 2 = order number of this record
0b 001 = node pointer (inside B-tree)
0x 00 0e = next record offset -> page05
minId = 0x 80 00 00 01 = 1
pageNo = 0x 00 00 00 04# page5
0x 00 = nulls
0x 0 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0001 1 = 3 = order number of this record
0b 001 = node pointer (inside B-tree)
0x 00 0e = next record offset -> page06
minId = 0x 80 00 01 2e = 302
pageNo = 0x 00 00 00 05# page6
0x 00 = nulls
0x 0 = delete flag
0x 0 = number of records owned by the record
0b 0000 0000 0010 0 = 4 = order number of this record
0b 001 = node pointer (inside B-tree)
0x ff d6 = next record offset -> supremum
minId = 0x 80 00 02 cf = 719
pageNo = 0x 00 00 00 06
根据 index page 确定数据所在 page
通过上面 index page 里面的索引信息, 以及我们这里查询的 991 限定来确定数据属于哪一个 page
这里的查询会有两层搜索, 通过 pageDirectory 的搜索, 通过最近的 pageDirectory 线性查询目标索引, 这里 991 属于 page6
看这里的 low_rec, 指向的记录就是上面的 [719, supremum] -> page6
获取数据 page
pageNo 为 6, 获取 page6, 该 page 的地址为 block->frame : 0x121804000
我们来 inspect 一下 0x121804000
(lldb) x 0x121804000 -c 0x100
0x121804000: e5 86 89 21 00 00 00 06 00 00 00 05 ff ff ff ff �..!........����
0x121804010: 00 00 00 00 00 1d a6 f8 45 bf 00 00 00 00 00 00 ......��E�......
0x121804020: 00 00 00 00 00 06 00 47 27 fc 81 1b 00 00 00 00 .......G'�......
0x121804030: 27 df 00 02 01 18 01 19 00 00 00 00 00 00 00 00 '�..............
0x121804040: 00 00 00 00 00 00 00 00 00 16 00 00 00 00 00 00 ................
0x121804050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ................
0x121804060: 02 00 1c 69 6e 66 69 6d 75 6d 00 06 00 0b 00 00 ...infimum......
0x121804070: 73 75 70 72 65 6d 75 6d 08 00 00 00 10 00 24 80 supremum......$.
0x121804080: 00 02 cf 00 00 00 00 41 75 f1 00 00 01 e7 01 10 ..�....Au�...�..
0x121804090: 80 00 00 16 6a 65 72 72 79 37 31 39 08 00 00 00 ....jerry719....
0x1218040a0: 18 00 24 80 00 02 d0 00 00 00 00 41 76 f2 00 00 ..$...�....Av�..
0x1218040b0: 01 e8 01 10 80 00 00 16 6a 65 72 72 79 37 32 30 .�......jerry720
0x1218040c0: 08 00 00 00 20 00 24 80 00 02 d1 00 00 00 00 41 .... .$...�....A
0x1218040d0: 77 f3 00 00 01 e9 01 10 80 00 00 16 6a 65 72 72 w�...�......jerr
0x1218040e0: 79 37 32 31 08 00 04 00 28 00 24 80 00 02 d2 00 y721....(.$...�.
0x1218040f0: 00 00 00 41 78 f4 00 00 01 ea 01 10 80 00 00 16 ...Ax�...�......# FileHeader
FIL_PAGE_SPACE = e5 86 89 21
FIL_PAGE_OFFSET = 00 00 00 06
FIL_PAGE_PREV = 00 00 00 05
FIL_PAGE_NEXT = ff ff ff ff
FIL_PAGE_LSN = 00 00 00 00 00 1d a6 f8
FIL_PAGE_TYPE = 45 bf
FIL_PAGE_FILE_FLUSH_LSN = 00 00 00 00 00 00 00 00
FIL_PAGE_ARCH_LOG_NO = 00 00 00 06 # PageHeader
PAGE_N_DIR_SLOTS = 00 47
PAGE_HEAP_TOP = 27 fc
PAGE_N_HEAP = 81 1b
PAGE_FREE = 00 00
PAGE_GARBAGE = 00 00
PAGE_LAST_INSERT = 27 df
PAGE_DIRECTION = 00 02
PAGE_N_DIRECTION = 01 18
PAGE_N_RECS = 01 19
PAGE_MAX_TRX_ID = 00 00 00 00 00 00 00 00
PAGE_LEVEL = 00 00
PAGE_INDEX_ID = 00 00 00 00 00 00 00 16
PAGE_BTR_SEG_LEAF = 00 00 00 00 00 00 00 00 00 00
PAGE_BTR_SEG_TOP = 00 00 00 00 00 00 00 00 00 00 # UserRecords
jerry719 -> jerry720 -> jerry721 ... -> jerry999
我们来 inspect 一下 0x121807f00
从上面元数据可以知道, pageDirectory 总共有 71 个, 合计 142 字节, 加上末尾的 8 字节 FileTailer 合计 150 字节
0x121807fff - 0x121807f6a + 1 = 0x96 = 150 字节
可以看到这里的 pageDirectory 也是逆序排列的 infimum -> 0xeb -> 0x017b -> ... -> supremum [根据 id 排序]
(lldb) x 0x121807f00 -c 0x100
0x121807f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x121807f60: 00 00 00 00 00 00 00 00 00 00 00 70 27 2b 26 9b ...........p'+&.
0x121807f70: 26 0b 25 7b 24 eb 24 5b 23 cb 23 3b 22 ab 22 1b &.%{$�$[#�#;"�".
0x121807f80: 21 8b 20 fb 20 6b 1f db 1f 4b 1e bb 1e 2b 1d 9b !. � k.�.K.�.+..
0x121807f90: 1d 0b 1c 7b 1b eb 1b 5b 1a cb 1a 3b 19 ab 19 1b ...{.�.[.�.;.�..
0x121807fa0: 18 8b 17 fb 17 6b 16 db 16 4b 15 bb 15 2b 14 9b ...�.k.�.K.�.+..
0x121807fb0: 14 0b 13 7b 12 eb 12 5b 11 cb 11 3b 10 ab 10 1b ...{.�.[.�.;.�..
0x121807fc0: 0f 8b 0e fb 0e 6b 0d db 0d 4b 0c bb 0c 2b 0b 9b ...�.k.�.K.�.+..
0x121807fd0: 0b 0b 0a 7b 09 eb 09 5b 08 cb 08 3b 07 ab 07 1b ...{.�.[.�.;.�..
0x121807fe0: 06 8b 05 fb 05 6b 04 db 04 4b 03 bb 03 2b 02 9b ...�.k.�.K.�.+..
0x121807ff0: 02 0b 01 7b 00 eb 00 63 14 23 33 ed 00 1d a6 f8 ...{.�.c.#3�..��
根据数据page 定位 id = 991
这里的查询会有两层搜索, 通过 pageDirectory 的搜索, 通过最近的 pageDirectory 线性查询目标索引, 这里 991 对应于 up_rec
看这里的 up_rec, 指向的记录就是上面的 (991, 22, jerry991)
我们来 inspect 一下 up_rec, 正是我们这里期望查询的 id = '991' 对应的记录
(lldb) x 0x1218066bf
0x1218066bf: 80 00 03 df 00 00 00 00 42 85 81 00 00 01 32 01 ...�....B.....2.
0x1218066cf: 10 80 00 00 16 6a 65 72 72 79 39 39 31 08 00 00 .....jerry991...
外部的业务函数 row_search_for_mysql
上面这里查询到了 id = '991' 对应的记录, 封装在了 pcur->btr_cur->page_cur->rec 里面
上面的流程是在 row_search_for_mysql 的 btr_pcur_open_with_no_init 这里, 这里的作用就是初始化 pcur, 为后面的业务迭代做准备
接下来走的便是根据 pcur->btr_cur->page_cur->rec 进行迭代, 比较是否符合查询条件, 输出记录信息到客户端等等流程
所以这里会做的事情是, 当前 rec 是在 id = '991', 然后 比较是否符合查询条件, 这里是符合, 然后将记录输出到客户端
然后会进入 prebuilt->n_fetch_cached < MYSQL_FETCH_CACHE_SIZE 的条件, 继续下一个元素的迭代
迭代到 rec 是在 id = '992', 然后 比较是否符合查询条件, 这里是不匹配, 走的时候 normal_return, 退出查询
我们来 inspect 一下 0x1218066bf
(lldb) x 0x1218066bf
0x1218066bf: 80 00 03 df 00 00 00 00 42 85 81 00 00 01 32 01 ...�....B.....2.
0x1218066cf: 10 80 00 00 16 6a 65 72 72 79 39 39 31 08 00 00 .....jerry991...
迭代元素 id = '992'
我们来 inspect 一下 0x1218066e3
(lldb) x 0x1218066e3
0x1218066e3: 80 00 03 e0 00 00 00 00 42 86 82 00 00 01 35 01 ...�....B.....5.
0x1218066f3: 10 80 00 00 16 6a 65 72 72 79 39 39 32 08 00 00 .....jerry992...
explain 的结果
我们来看一下 explain 的结果, 会使用 primary key 来索引, 大约会扫描 1 行记录
select * from `user`
初始化 pcur->btr_cur->page_cur->rec
这个查询相对来说 走的流程比较简单, 查询的最小的 数据page的 infimum, 然后不断往后迭代, 直到所有元素迭代完成
这里是初始化 pcur->btr_cur->page_cur->rec 为最小的 数据page的 infimum
这里的迭代是从 index page 开始的, 从 level 最高的 index page 开始向下迭代, 如果是 fromLeft 表示最终取最小的数据页的 infimum, 如果是 !fromLeft 表示最终取最大的数据页的 supremum
根据 pcur->btr_cur->page_cur->rec 进行迭代
然后接下来就是不断地向后迭代, 输出查询的元素信息到客户端
当前 page 到达了末尾, 切换到下一个 page
btr_pcur_is_after_last_in_tree 判断当前 page 是否是最后一个 page, 判断的方式是 pageNext 是否为 0xffffffff
explain 的结果
我们来看一下 explain 的结果, 全表扫描, 大约会扫描 906 行记录
select * from `user` where name = 'jerry991'
初始化 pcur->btr_cur->page_cur->rec
这里的初始化过程 和上面的 "select * from `user`" 的初始化是一样的, 初始化 pcur->btr_cur->page_cur->rec 为 page4->infimum
然后不断向后迭代数据, 直到全表的数据迭代完成
我们来 inspect 一下 这一页的数据
(lldb) x 0x11cf1c000 -c 0x100
0x11cf1c000: 94 8c b5 2e 00 00 00 04 ff ff ff ff 00 00 00 05 ..�.....����....
0x11cf1c010: 00 00 00 00 00 1d 34 e5 45 bf 00 00 00 00 00 00 ......4�E�......
0x11cf1c020: 00 00 00 00 00 06 00 36 3b 0d 81 a3 1d b0 1d 64 .......6;..�.�.d
0x11cf1c030: 00 00 00 05 00 00 00 d0 00 00 00 00 00 00 00 00 .......�........
0x11cf1c040: 00 00 00 00 00 00 00 00 00 16 00 00 00 00 00 00 ................
0x11cf1c050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ................
0x11cf1c060: 02 00 1c 69 6e 66 69 6d 75 6d 00 01 00 0b 00 00 ...infimum......
0x11cf1c070: 73 75 70 72 65 6d 75 6d 05 00 00 00 10 00 21 80 supremum......!.
0x11cf1c080: 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04 7b .......+.....V.{
0x11cf1c090: 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 00 20 ....jerry......
0x11cf1c0a0: 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36 01 ........5.....6.
0x11cf1c0b0: 10 80 00 00 16 6c 75 63 79 06 00 00 00 20 00 22 .....lucy.... ."
0x11cf1c0c0: 80 00 00 05 00 00 00 00 3d 14 8a 00 00 01 91 01 ........=.......
0x11cf1c0d0: 10 80 00 00 16 6a 65 72 72 79 35 06 00 04 00 28 .....jerry5....(
0x11cf1c0e0: 00 22 80 00 00 07 00 00 00 00 3d 0b 84 00 00 01 ."........=.....
0x11cf1c0f0: 37 01 10 80 00 00 16 6a 65 72 72 79 37 06 00 00 7......jerry7...
根据 pcur->btr_cur->page_cur->rec 进行迭代
然后接下来就是不断地向后迭代, 输出查询的元素信息到客户端
todo, 这里根据条件过滤, 以及数据传递, 还需要再找找
完
相关文章:

06 mysql all查询 和 主键查询 和 非索引列查询
前言 本文主要调试一下 mysql 的如下两种查询语句 我们也来深入的看一下, 究竟如下两个普通的查询, mysql 做了什么事情 1. select * from user where id 991; 2. select * from user; 3. select * from user where name jerry991; 环境介绍 测试表 user schema 如下…...

黑马点评-项目集成git及redis实现短信验证码登录
目录 IDEA集成git 传统session存在的问题 redis方案 业务流程 选用的数据结构 整体访问流程 发送短信验证码 获取校验验证码 配置登录拦截器 拦截器注册配置类 拦截器 用户状态刷新问题 刷新问题解决方案 IDEA集成git 远程仓库采用码云,创建好仓库&…...

mac苹果电脑怎么运行Windows软件?怎么安装Win虚拟机?
近年来,苹果电脑的用户群体不断扩大,许多用户对于苹果电脑是否可以运行Windows软件产生了疑问。苹果电脑和Windows操作系统有着明显的区别,是否能够在苹果电脑上运行Windows软件。下面我们就来看苹果电脑可以运行Windows软件吗,苹…...

Jmeter对websocket进行测试
JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪,需要带认证信息进行长连接,通过websocket插件是请求失败,如下图,后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下: pa…...

从2023年世界机器人大会发现机器人新趋势
机器人零部件为何成2023年世界机器人大会关注热门? 在原先,机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今,机器人的主体框架结构已经落实,更多机器人已经开始深入到各类场景中…...

Kafka单节点部署
🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…...

生成式AI和大语言模型 Generative AI LLMs
在“使用大型语言模型(LLMs)的生成性AI”中,您将学习生成性AI的基本工作原理,以及如何在实际应用中部署它。 通过参加这门课程,您将学会: 深入了解生成性AI,描述基于LLM的典型生成性AI生命周期中的关键步骤ÿ…...

Obsidian 入门使用手册
文章目录 一、Obsidian 入门1.1 什么是 Obsidian1.2 安装 Obsidian 二、Obsidian 配置2.1 创建第一个笔记2.2 设置界面语言使用中文2.3 主题 三、小结 一、Obsidian 入门 1.1 什么是 Obsidian Obsidian 是一款基于 Markdown 语法编辑的笔记软件。与传统的 Markdown 软件不同的…...

GuLi商城-前端基础Vue指令-单向绑定双向绑定
什么是指令? 指令 (Directives) 是带有 v- 前缀的特殊特性。 指令特性的预期值是:单个 JavaScript 表达式。 指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM 例如我们在入门案例中的 v-on,代表绑定事…...

前端(十三)——JavaScript 闭包的奥秘与高级用法探索
😶博主:小猫娃来啦 😶文章核心:深入理解 JavaScript 中的闭包 文章目录 不理解闭包?这玩意很难?闭包的定义与原理闭包是什么创建一个闭包 闭包的应用场景闭包与作用域闭包与作用域之间的关系全局作用域、函…...

面试-快速学习计算机网络-UDP/TCP
1. OSI四层和七层映射 区别: 应用层,表示层,会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别? 总结: 1 . TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服…...

爱校对如何帮助企业和博客主提高在线可见性?
在数字化时代,内容质量已经成为增强在线曝光率的关键因素。企业和博客主经常面临挑战,如何制作高质量、无误的内容以吸引更多的在线用户。此文将详细分析“爱校对”如何帮助用户优化内容,从而提高在线可见性。 1.互联网内容的挑战 搜索引擎…...

MATLAB中xlsread函数用法
目录 语法 说明 示例 将工作表读取到数值矩阵 读取元胞的范围 读取列 请求数值、文本和原始数据 对工作表执行函数 请求自定义输出 局限性 xlsread函数的功能是读取Microsoft Excel 电子表格文件 语法 num xlsread(filename) num xlsread(filename,sheet) num x…...

Prisma.js:JavaScript中的基于代码的ORM
Prisma是一种流行的用于服务器端JavaScript和TypeScript的数据映射层(ORM)。它的核心目的是简化和自动化数据在存储和应用程序代码之间的传输方式。Prisma支持各种数据存储,并为数据持久化提供了一个强大而灵活的抽象层。通过这个基于代码的…...

解决问题:在cocos create中如何从b文件调用到a文件里用CC.resource.load动态加载的图集
目录 1.在a文件中定义一个公共的变量存储动态加载的图集 2.在a.js中添加一个静态方法,返回动态加载的图集 3.在b.js中使用a.js中定义的静态方法获取图集,并使用它 假设a文件中用CC.resource.load动态加载了一张图集,b文件需要使用这张图集&am…...

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式
文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题?3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办?5. 如何从特定…...

如何利用 ChatGPT 进行自动数据清理和预处理
推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀,并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型,您就会知道数据清理和预…...

PHP“牵手”淘宝商品评论数据采集方法,淘宝API接口申请指南
淘宝天猫商品评论数据接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用…...

你更喜欢哪一个:VueJS 还是 ReactJS?
观点列表: 1、如果你想在 HTML 中使用 JS,请使用 Vue; 如果你想在 JS 中使用 HTML,请使用 React。 当然,如果您希望在 JS 中使用 HTML,请将 Vue 与 JSX 结合使用。 2、Svelte:我喜欢它&#…...

PyTorch学习笔记(十六)——利用GPU训练
一、方式一 网络模型、损失函数、数据(包括输入、标注) 找到以上三种变量,调用它们的.cuda(),再返回即可 if torch.cuda.is_available():mynn mynn.cuda() if torch.cuda.is_available():loss_function loss_function.cuda(…...

【实战】十一、看板页面及任务组页面开发(三) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十五)
文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

金额千位符自定义指令
自定义指令文件 moneyFormat.js /*** v-money 金额千分位转换*/export default {inserted: inputFormatter({// 格式化函数formatter(num, util) {if(num null || num || num undefined || typeof(num) undefined){return }if(util 万元 || util 万){return formatMone…...

请不要用 JSON 作为配置文件,使用JSON做配置文件的缺点
我最近关注到有的项目使用JSON作为配置文件。我觉得这不是个好主意。 这不是JSON的设计目的,因此也不是它擅长的。JSON旨在成为一种“轻量级数据交换格式”,并声称它“易于人类读写”和“易于机器解析和生成”。 作为一种数据交换格式,JSON是…...

Hadabot:从网络浏览器操作 ROS2 远程控制器
一、说明 Hadabot Hadabot是一个学习ROS2和机器人技术的机器人套件。使用 Hadabot,您将能够以最小的挫败感和恐吓来构建和编程物理 ROS2 机器人。Hadabot套件目前正在开发中。它将仅针对ROS2功能,并强调基于Web的用户界面。 随着开发的进展&a…...

Kotlin 协程
Kotlin 协程(Coroutines)是一种轻量级的并发编程解决方案,旨在简化异步操作和多线程编程。它提供了一种顺序和非阻塞的方式来处理并发任务,使得代码可以更加简洁和易于理解。Kotlin 协程通过提供一套高级 API,使并发代…...

maven 从官网下载指定版本
1. 进入官网下载页面 Maven – Download Apache Maven 点击下图所示链接 2. 进入文件页,选择需要的版本 3. 选binaries 4. 选文件,下载即可...

数据结构---串(赋值,求子串,比较,定位)
目录 一.初始化 顺序表中串的存储 串的链式存储 二.赋值操作:将str赋值给S 链式表 顺序表 三.复制操作:将chars复制到str中 链式表 顺序表 四.判空操作 链式表 顺序表 五.清空操作 六.串联结 链式表 顺序表 七.求子串 链式表 顺序表…...

WPF CommunityToolkit.Mvvm
文章目录 前言ToolkitNuget安装简单使用SetProperty,通知更新RealyCommandCanExecute 新功能,代码生成器ObservablePropertyNotifyCanExecuteChangedForRelayCommand其他功能对应关系 NotifyPropertyChangedFor 前言 CommunityToolkit.Mvvm(…...

Vue开发中如何解决国际化语言切换问题
Vue开发中如何解决国际化语言切换问题 引言: 在如今的全球化时代,应用程序的国际化变得越来越重要。为了让不同地区的用户能够更好地使用应用程序,我们需要对内容进行本地化,以适应不同语言和文化环境。对于使用Vue进行开发的应用…...

基于springboot+vue的流动人口登记系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...