当前位置: 首页 > news >正文

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` 表中的测试数据如下 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

 

select * from `user` where id = '991'

我们这里会着重介绍这个 case, 这里面会详细的看一下 index page, data page 的情况, 以及其具体的执行的流程 

另外这个过程中我们会忽略掉一些细节, 尽量只查看这个业务查询的核心业务流程 

 

 

获取 index page 

index -> page 为 3, 表示第三个 page 为索引页面, pageNo 初始化为 index->page, 该 page 的地址为 block->frame : 0x1217f4000 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们 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 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

获取数据 page 

pageNo 为 6, 获取 page6, 该 page 的地址为 block->frame : 0x121804000 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 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) 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 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, 退出查询 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 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'

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 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 行记录

20210331094127251.png

 

 

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 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

根据 pcur->btr_cur->page_cur->rec 进行迭代 

然后接下来就是不断地向后迭代, 输出查询的元素信息到客户端 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

当前 page 到达了末尾, 切换到下一个 page 

btr_pcur_is_after_last_in_tree 判断当前 page 是否是最后一个 page, 判断的方式是 pageNext 是否为 0xffffffff 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

explain 的结果

我们来看一下 explain 的结果, 全表扫描, 大约会扫描 906 行记录

20210331094249330.png

 

 

select * from `user` where name = 'jerry991'

初始化 pcur->btr_cur->page_cur->rec 

这里的初始化过程 和上面的 "select * from `user`" 的初始化是一样的, 初始化 pcur->btr_cur->page_cur->rec 为 page4->infimum 

然后不断向后迭代数据, 直到全表的数据迭代完成 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

我们来 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, 这里根据条件过滤, 以及数据传递, 还需要再找找 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

 

完 

 

 

 

相关文章:

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 远程仓库采用码云&#xff0c;创建好仓库&…...

mac苹果电脑怎么运行Windows软件?怎么安装Win虚拟机?

近年来&#xff0c;苹果电脑的用户群体不断扩大&#xff0c;许多用户对于苹果电脑是否可以运行Windows软件产生了疑问。苹果电脑和Windows操作系统有着明显的区别&#xff0c;是否能够在苹果电脑上运行Windows软件。下面我们就来看苹果电脑可以运行Windows软件吗&#xff0c;苹…...

Jmeter对websocket进行测试

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

从2023年世界机器人大会发现机器人新趋势

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

Kafka单节点部署

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

生成式AI和大语言模型 Generative AI LLMs

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

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 表达式。 指令的职责是&#xff0c;当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式地作用于DOM 例如我们在入门案例中的 v-on&#xff0c;代表绑定事…...

前端(十三)——JavaScript 闭包的奥秘与高级用法探索

&#x1f636;博主&#xff1a;小猫娃来啦 &#x1f636;文章核心&#xff1a;深入理解 JavaScript 中的闭包 文章目录 不理解闭包&#xff1f;这玩意很难&#xff1f;闭包的定义与原理闭包是什么创建一个闭包 闭包的应用场景闭包与作用域闭包与作用域之间的关系全局作用域、函…...

面试-快速学习计算机网络-UDP/TCP

1. OSI四层和七层映射 区别&#xff1a; 应用层&#xff0c;表示层&#xff0c;会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别&#xff1f; 总结&#xff1a; 1 . TCP 向上层提供面向连接的可靠服务 &#xff0c;UDP 向上层提供无连接不可靠服…...

爱校对如何帮助企业和博客主提高在线可见性?

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

MATLAB中xlsread函数用法

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

Prisma.js:JavaScript中的基于代码的ORM

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

解决问题:在cocos create中如何从b文件调用到a文件里用CC.resource.load动态加载的图集

目录 1.在a文件中定义一个公共的变量存储动态加载的图集 2.在a.js中添加一个静态方法&#xff0c;返回动态加载的图集 3.在b.js中使用a.js中定义的静态方法获取图集&#xff0c;并使用它 假设a文件中用CC.resource.load动态加载了一张图集&#xff0c;b文件需要使用这张图集&am…...

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题&#xff1f;3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办&#xff1f;5. 如何从特定…...

如何利用 ChatGPT 进行自动数据清理和预处理

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

PHP“牵手”淘宝商品评论数据采集方法,淘宝API接口申请指南

淘宝天猫商品评论数据接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在电商平台的开发中&#xff0c;详情接口API是非常常用的 API&#xff0c;因此本文将详细介绍详情接口 API 的使用…...

你更喜欢哪一个:VueJS 还是 ReactJS?

观点列表&#xff1a; 1、如果你想在 HTML 中使用 JS&#xff0c;请使用 Vue&#xff1b; 如果你想在 JS 中使用 HTML&#xff0c;请使用 React。 当然&#xff0c;如果您希望在 JS 中使用 HTML&#xff0c;请将 Vue 与 JSX 结合使用。 2、Svelte&#xff1a;我喜欢它&#…...

PyTorch学习笔记(十六)——利用GPU训练

一、方式一 网络模型、损失函数、数据&#xff08;包括输入、标注&#xff09; 找到以上三种变量&#xff0c;调用它们的.cuda()&#xff0c;再返回即可 if torch.cuda.is_available():mynn mynn.cuda() if torch.cuda.is_available():loss_function loss_function.cuda(…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...