• InnoDB底层存储结构探秘


    一 innoDB 为什么不用平衡二叉树

    计算机存储层次结构

    计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory)。

    内存储器为内存,内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电情况下数据会消失)。

    外存储器即为磁盘读取,磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms;传输时间指的是从磁盘读出或将数据写入磁盘的时间,一般在零点几毫秒,相对于前两个时间可以忽略不计。那么访问一次磁盘的时间,即一次磁盘IO的时间约等于5+4.17 = 9ms左右,听起来还挺不错的,但要知道一台50MIPS的机器每秒可以执行5亿条指令,因为指令依靠的是电的性质,换句话说执行一次IO的时间可以执行450万条指令。一条读SQL需要多次访问磁盘,每次9毫秒的时间,显然是个灾难。
    请添加图片描述

    不同介质的访问时间好事,数据来源于google大神Jeff dean

    存储介质速度
    L1 cache reference 读取CPU的一级缓存0.5 ns
    Branch mispredict(转移、分支预测)5 ns
    L2 cache reference 读取CPU的二级缓存7 ns
    Mutex lock/unlock 互斥锁\解锁100 ns
    Main memory reference 读取内存数据100 ns
    Compress 1K bytes with Zippy 1k字节压缩10,000 ns
    Send 2K bytes over 1 Gbps network 在1Gbps的网络上发送2k字节20,000 ns
    Read 1 MB sequentially from memory 从内存顺序读取1MB250,000 ns
    Round trip within same datacenter 从一个数据中心往返一次,ping一下500,000 ns
    Disk seek 磁盘搜索10,000,000 ns
    Read 1 MB sequentially from network从网络上顺序读取1兆的数据10,000,000 ns
    Read 1 MB sequentially from disk 从磁盘里面读出1MB30,000,000 ns
    Send packet CA->Netherlands->CA 一个包的一次远程访问150,000,000 ns

    考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。

    假定一张表有1023个记录,用平衡二叉树存储高度是10.访问一行数据需要磁盘搜索10个磁盘块。磁盘块随机读取一次是10ms,也就是访问一行需要10个10ms。为了提速,需要尽可能少的访问磁盘块。一个n叉平衡排序树,节点数量N相同的情况下,它的高度是logn(N)。想降低磁盘访问次数,需要增大n。如果是10叉排序树,那么这张表只需要3到4次磁盘随机访问。

    本文讲解辅助用表:

    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` char(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5亿条记录,表空间20GB的test表只有3层

    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/test -I PRIMARY -l 0 index-level-summary | wc -l
     1146555
    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/test -I PRIMARY -l 1 index-level-summary | wc -l
        1093
    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/test -I PRIMARY -l 2 index-level-summary
    page    index   level   data    free    records min_key
    3       97      2       15288   418     1092    id=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1到4层B+树能装填的最大记录数, 数据来源 https://blog.jcole.us/2013/01/10/btree-index-structures-in-innodb/

    HeightNon-leaf pagesLeaf pagesRowsSize in bytes
    10146816.0 KiB
    211203> 563 thousand18.8 MiB
    312041447209> 677 million22.1 GiB
    414484131740992427> 814 billion25.9 TiB

    二 B+树数据结构

    B+树是一种数据结构,是一个N叉排序树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点, 也可能是一个包含两个或两个以上孩子节点的节点。

    B+树通常用于数据库和操作系统的文件系统中。NTFS、ReiserFS、NSS、XFS、JFS、ReFS和BFS等文件系统都在使用B+树作为元数据索引。B+树的特点是能够保持数据稳定有序, 其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入。

    请添加图片描述

    B+树的定义

    B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶B+树和m阶的B-树的差异在于:

    1) 有n棵子树的节点中含有n个关键字(即每个关键字对应一棵子树);

    2) 所有叶子节点中包含了全部关键字的信息, 及指向含这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接;

    3) 所有的非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字

    4) 除根节点外,其他所有节点中所含关键字的个数必须>=⌈m/2⌉(注意: B-树是除根以外的所有非终端节点至少有⌈m/2⌉棵子树)

    上图是所示为一棵3阶的B+树,通常在B+树上有两个指针头, 一个指向根节点,另一个指向关键字最小的叶子节点。因此,可以对B+树进行两种查找运算: 一种是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找

    innodb_space -s ibdata1 -T  identity/identity_app_token -I PRIMARY -l 0 index-level-summary | wc -l
    innodb_space -s ibdata1 -T  identity/test -I PRIMARY -l 2 index-level-summary
    
    • 1
    • 2

    三 Page结构

    页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB;磁盘读取的最小单位,即使只需要读一行记录,也需要载入一个page的数据。基本页结构概览:

    请添加图片描述

    文件头数据结构:

    请添加图片描述

    根据页号可以算出一张表最大可以占用多大的物理空间。前驱指针和后继指针让同一个层级的Page构成一个双向链表,让范围查找变成可能。

    用户记录数据结构:
    请添加图片描述

    所有的记录已单链表的逻辑结构存储。

    页目录:用户记录(User Records)链表的辅助指针数组。每4-8个连续记录一组,页目录里的Slot(槽)指向这一组的最后一个记录的偏移地址。

    空间换时间,让二分查找在单链表上变为可能。

    innodb_space -s ibdata1 -T  identity/identity_app_token -p 3 page-records
    innodb_space -s ibdata1 -T  identity/identity_app_token -p 3 page-dump | more
    innodb_space -s ibdata1 -T  identity/identity_app_token -p 3 page-illustrate
    
    • 1
    • 2
    • 3

    请添加图片描述

    一个简单SQL的查找过程

    select *
    from identity_app_token
    where id = 723027
    
    • 1
    • 2
    • 3
    1 先看根节点(默认3号)page
    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/identity_app_token -p 3 page-records
    /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin21/rbconfig.rb:230: warning: Insecure world writable dir /opt/homebrew in PATH, mode 040777
    Record 130: (id=187010)#711
    Record 148: (id=282852)#712
    Record 166: (id=348011)#713
    Record 184: (id=498519)#716
    Record 202: (id=524815)#717
    Record 220: (id=551231)#719
    Record 238: (id=665015)#720
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    目标id 723027 大于 665015, 因此我们需要在第二层索引720号page继续查找

    2 查找第二层索引page720号页面, 数据比较多,这里仅截取部分有用数据
    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/identity_app_token -p 720 page-records
    /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin21/rbconfig.rb:230: warning: Insecure world writable dir /opt/homebrew in PATH, mode 040777
    Record 130: (id=665015)#6141
    Record 148: (id=665039)#6142
    Record 166: (id=665062)#6143
    Record 184: (id=665085)#6144
    Record 202: (id=665109)#6145
    Record 220: (id=665132)#6146
    Record 238: (id=665156)#6147
    Record 256: (id=665182)#6148
    Record 274: (id=666014)#6149
    Record 292: (id=667005)#6150
    Record 310: (id=667026)#6151
    Record 328: (id=667050)#6152
    Record 346: (id=667073)#6153
    Record 364: (id=669000)#6154
    Record 382: (id=671016)#6155
    Record 400: (id=671037)#6156
    Record 418: (id=671060)#6157
    Record 436: (id=674002)#6158
    Record 454: (id=676016)#6159
    Record 472: (id=677019)#6160
    Record 490: (id=677038)#6161
    Record 508: (id=677058)#6162
    Record 526: (id=677080)#6163
    Record 544: (id=677101)#6164
    Record 562: (id=677123)#6165
    Record 580: (id=677149)#6166
    Record 598: (id=677175)#6167
    Record 616: (id=677200)#6168
    Record 634: (id=677225)#6169
    Record 652: (id=677247)#6170
    Record 670: (id=677271)#6171
    Record 688: (id=677298)#6172
    Record 706: (id=677322)#6173
    Record 724: (id=677347)#6174
    Record 742: (id=677371)#6175
    Record 760: (id=677394)#6176
    Record 778: (id=677418)#6177
    Record 796: (id=677441)#6178
    Record 814: (id=677464)#6179
    Record 832: (id=677487)#6180
    Record 850: (id=677506)#6181
    Record 868: (id=677527)#6182
    Record 886: (id=677544)#6183
    Record 904: (id=677563)#6184
    Record 922: (id=677582)#6185
    Record 940: (id=677603)#6186
    Record 958: (id=677625)#6187
    Record 976: (id=677647)#6188
    Record 994: (id=677669)#6189
    Record 1012: (id=677692)#6190
    Record 1030: (id=677712)#6191
    Record 1048: (id=677733)#6192
    Record 1066: (id=677754)#6193
    Record 1084: (id=677774)#6194
    Record 1102: (id=677793)#6195
    Record 1120: (id=677813)#6196
    Record 1138: (id=677831)#6197
    Record 1156: (id=678017)#6198
    Record 1174: (id=678034)#6199
    Record 1192: (id=679008)#6200
    Record 1210: (id=679028)#6201
    Record 1228: (id=680007)#6202
    Record 1246: (id=680031)#6203
    Record 1264: (id=680054)#6204
    Record 1282: (id=680074)#6205
    Record 1300: (id=680094)#6206
    Record 1318: (id=680114)#6207
    Record 1336: (id=682014)#6208
    Record 1354: (id=683010)#6209
    Record 1372: (id=683032)#6210
    Record 1390: (id=684010)#6211
    Record 1408: (id=685017)#6212
    Record 1426: (id=685038)#6213
    Record 1444: (id=686000)#6214
    Record 1462: (id=686019)#6215
    Record 1480: (id=686036)#6216
    Record 1498: (id=686054)#6217
    Record 1516: (id=687021)#6218
    Record 1534: (id=688010)#6219
    Record 1552: (id=689003)#6220
    Record 1570: (id=689024)#6221
    Record 1588: (id=689046)#6222
    Record 1606: (id=691001)#6223
    Record 1624: (id=691023)#6224
    Record 1642: (id=694005)#6225
    Record 1660: (id=695022)#6226
    Record 1678: (id=697001)#6227
    Record 1696: (id=699001)#6228
    Record 1714: (id=700001)#6229
    Record 1732: (id=700023)#6230
    Record 1750: (id=702000)#6231
    Record 1768: (id=704001)#6232
    Record 1786: (id=706014)#6233
    Record 1804: (id=708021)#6234
    Record 1822: (id=708043)#6235
    Record 1840: (id=709019)#6236
    Record 1858: (id=709041)#6237
    Record 1876: (id=710010)#6238
    Record 1894: (id=710031)#6239
    Record 1912: (id=710056)#6240
    Record 1930: (id=710080)#6241
    Record 1948: (id=712007)#6242
    Record 1966: (id=714004)#6243
    Record 1984: (id=714028)#6244
    Record 2002: (id=715010)#6245
    Record 2020: (id=716014)#6246
    Record 2038: (id=717000)#6247
    Record 2056: (id=718005)#6248
    Record 2074: (id=719018)#6249
    Record 2092: (id=719041)#6250
    Record 2110: (id=719063)#6251
    Record 2128: (id=719086)#6252
    Record 2146: (id=719108)#6253
    Record 2164: (id=719131)#6254
    Record 2182: (id=719153)#6255
    Record 2200: (id=719174)#6256
    Record 2218: (id=719198)#6257
    Record 2236: (id=719220)#6258
    Record 2254: (id=719242)#6259
    Record 2272: (id=719265)#6260
    Record 2290: (id=719288)#6261
    Record 2308: (id=720000)#6262
    Record 2326: (id=721017)#6263
    Record 2344: (id=721039)#6264
    Record 2362: (id=721062)#6265
    Record 2380: (id=721085)#6266
    Record 2398: (id=721107)#6267
    Record 2416: (id=721130)#6268
    Record 2434: (id=721152)#6269
    Record 2452: (id=721174)#6270
    Record 2470: (id=721197)#6271
    Record 2488: (id=721220)#6272
    Record 2506: (id=722019)#6273
    Record 2524: (id=723007)#6274
    Record 2542: (id=723028)#6275
    Record 2560: (id=723051)#6276
    Record 2578: (id=723074)#6277
    Record 2596: (id=723098)#6278
    Record 2614: (id=723120)#6279
    Record 2632: (id=723144)#6280
    Record 2650: (id=723167)#6281
    Record 2668: (id=723189)#6282
    Record 2686: (id=723213)#6283
    Record 2704: (id=723236)#6284
    Record 2722: (id=723258)#6285
    Record 2740: (id=723282)#6286
    Record 2758: (id=723306)#6287
    Record 2776: (id=723328)#6288
    Record 2794: (id=723352)#6289
    Record 2812: (id=724020)#6290
    Record 2830: (id=725003)#6291
    Record 2848: (id=726004)#6292
    Record 2866: (id=726027)#6293
    Record 2884: (id=726047)#6294
    Record 2902: (id=726070)#6295
    Record 2920: (id=726093)#6296
    Record 2938: (id=727000)#6297
    Record 2956: (id=727022)#6298
    Record 2974: (id=728001)#6299
    Record 2992: (id=728024)#6300
    Record 3010: (id=729015)#6301
    Record 3028: (id=730006)#6302
    Record 3046: (id=730029)#6303
    Record 3064: (id=730052)#6304
    Record 3082: (id=731006)#6305
    Record 3100: (id=731028)#6306
    Record 3118: (id=731053)#6307
    Record 3136: (id=732016)#6308
    Record 3154: (id=732039)#6309
    Record 3172: (id=732062)#6310
    Record 3190: (id=732086)#6311
    Record 3208: (id=732110)#6312
    Record 3226: (id=732134)#6313
    Record 3244: (id=732156)#6314
    Record 3262: (id=732176)#6315
    Record 3280: (id=732198)#6316
    Record 3298: (id=732219)#6317
    Record 3316: (id=736000)#6318
    ➜  mysql git:(stable)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181

    目标id 723027 介于下面两个记录之间,因此在第三层索引页面6274上继续寻找

    Record 2524: (id=723007) → #6274
    Record 2542: (id=723028) → #6275

    3 查找第三层page 6274号页面, 通过输出我们发现,这是一层是数据page
    ➜  mysql git:(stable) innodb_space -s ibdata1 -T  identity/identity_app_token -p 6274 page-records
    /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin21/rbconfig.rb:230: warning: Insecure world writable dir /opt/homebrew in PATH, mode 040777
    Record 149: (id=723007)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000038", user_mobile=:NULL, enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="115", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bf82e64d002d2914416087328f800c5bc", delete_flag="0", raw_add_time="185044806-73-65 02:32:60", raw_update_time="395357084-93-84 47:58:11", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0115\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C3c5f28", chain_hash="d4cdd5c91201a7a093b75f1f01\x81callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bf82e64d002d2914416087328f800c5bchttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 799: (id=723008)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000043", user_mobile=:NULL, enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="115", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bdde5fc67de40b6e97aaac3f9fd7ab2dc", delete_flag="0", raw_add_time="185044806-73-81 80:04:76", raw_update_time="395413379-93-37 89:71:23", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0115\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C5cd0d3", chain_hash="f2f212ea1201a7a093b75f1f01\x81callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bdde5fc67de40b6e97aaac3f9fd7ab2dchttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 1450: (id=723009)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000044", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b3ecbe1318b0318bf113472728c592ea9", delete_flag="0", raw_add_time="185044806-73-98 57:76:92", raw_update_time="395131904-95-70 79:05:63", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89fc71dc", chain_hash="decb2d701201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b3ecbe1318b0318bf113472728c592ea9http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 2132: (id=723010)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000045", user_mobile=:NULL, enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="115", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bd1f657e97e34266b66acceac3efa02f4", delete_flag="0", raw_add_time="185044806-74-15 35:49:08", raw_update_time="395469454-61-24 21:98:39", user_name="\xE8\xA5\xBF0e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0115\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF2-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C800248", chain_hash="e0abcb4c1201a7a093b75f1f01\x81callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bd1f657e97e34266b66acceac3efa02f4http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 2783: (id=723011)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000046", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bc523ab558b54698a3eab565bf8ee9321", delete_flag="0", raw_add_time="185044806-74-15 35:49:08", raw_update_time="395160052-45-47 50:12:19", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89c984d9", chain_hash="8319c0031201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bc523ab558b54698a3eab565bf8ee9321http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 3466: (id=723012)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000047", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b87801b7accdbe1d92aaf2223448ba7df", delete_flag="0", raw_add_time="185044806-74-48 90:93:40", raw_update_time="395188199-95-24 21:18:75", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89e860f3", chain_hash="18210c0f1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b87801b7accdbe1d92aaf2223448ba7dfhttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 4149: (id=723013)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000048", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40ba4a1941531282dbc9d7a273cfbaaa11f", delete_flag="0", raw_add_time="185044806-74-48 90:93:40", raw_update_time="395188199-95-24 21:18:75", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89006306", chain_hash="2bf6fedd1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40ba4a1941531282dbc9d7a273cfbaaa11fhttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 4832: (id=723014)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000049", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bed53e1f871121934eba6dfce6606501b", delete_flag="0", raw_add_time="185044806-74-65 68:65:56", raw_update_time="395216347-45-00 92:25:31", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89b1e5cd", chain_hash="f91d63da1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bed53e1f871121934eba6dfce6606501bhttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 5515: (id=723015)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000050", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b8a7833096774e1a08bba1985b6c667b2", delete_flag="0", raw_add_time="185044806-74-65 68:65:56", raw_update_time="395244494-94-77 63:31:87", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89ead309", chain_hash="af90cff21201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b8a7833096774e1a08bba1985b6c667b2http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 6198: (id=723016)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000051", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b0838c49b39d5d3356beeddd031028a66", delete_flag="0", raw_add_time="185044806-74-82 46:37:72", raw_update_time="395272642-44-54 34:38:43", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x8937cb06", chain_hash="c2f343b91201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b0838c49b39d5d3356beeddd031028a66http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 6882: (id=723017)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000052", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b9e115710b3771d59ad4ec034b23a6c0e", delete_flag="0", raw_add_time="185044806-74-82 46:37:72", raw_update_time="395272642-44-54 34:38:43", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Be81e17", chain_hash="a391bf1f1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b9e115710b3771d59ad4ec034b23a6c0ehttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147551264)
    Record 7629: (id=723018)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000053", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="116", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b3b0346da9492643d96a9120aaef2ddf6", delete_flag="0", raw_add_time="185044806-74-99 24:09:88", raw_update_time="395300789-94-31 05:44:99", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0116\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF1-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xB8\x89396866", chain_hash="6fb6e21e1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ck3\x001d2d", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b3b0346da9492643d96a9120aaef2ddf6http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 8313: (id=723019)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000054", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b1a090e6381389cb7cfcb3591bc1fe39d", delete_flag="0", raw_add_time="185044806-74-99 24:09:88", raw_update_time="395328937-44-07 76:51:55", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Bc0b26b", chain_hash="ec37b5ca1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b1a090e6381389cb7cfcb3591bc1fe39dhttp", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 9061: (id=723020)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000055", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b44d96ee6fc7d93d5ea28140032ba6af9", delete_flag="0", raw_add_time="185044806-75-16 01:82:04", raw_update_time="395328937-44-07 76:51:55", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Bb7a7d8", chain_hash="512274a61201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b44d96ee6fc7d93d5ea28140032ba6af9http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 9809: (id=723021)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000056", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b117ebb5a0ce5cde0c80794a40e288c48", delete_flag="0", raw_add_time="185044806-75-32 79:54:20", raw_update_time="395357084-93-84 47:58:11", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Bd9dc20", chain_hash="4af6bef11201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b117ebb5a0ce5cde0c80794a40e288c48http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 10557: (id=723022)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000057", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b28dd84878833cd6df7c6231be329f872", delete_flag="0", raw_add_time="185044806-75-32 79:54:20", raw_update_time="395357084-93-84 47:58:11", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Bd5df0a", chain_hash="38aede191201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b28dd84878833cd6df7c6231be329f872http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 11305: (id=723023)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000058", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b19cc77bc01e01de030691359401e0dd3", delete_flag="0", raw_add_time="185044806-75-49 57:26:36", raw_update_time="395385232-43-61 18:64:67", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B82f75d", chain_hash="6d871a771201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b19cc77bc01e01de030691359401e0dd3http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 12053: (id=723024)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000059", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bf7490f4fab12bb5293799d7e2d41f190", delete_flag="0", raw_add_time="185044806-75-49 57:26:36", raw_update_time="395413379-93-37 89:71:23", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B10ca45", chain_hash="49d20eee1201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bf7490f4fab12bb5293799d7e2d41f190http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147565576)
    Record 12801: (id=723025)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000060", user_mobile="f1f2e738beb0848b99b1a6a331048ee0", enterprise_id=:NULL, enterprise_code=:NULL, status="finish", scene="117", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b0d603e259ddd0851210c0ff31699a289", delete_flag="0", raw_add_time="185044806-75-83 12:70:68", raw_update_time="395441527-43-14 60:77:79", user_name="\xE6\xAC\xA30e6b82", enterprise_name=:NULL, user_id_card="c28444914785481af2994094dcb826133cf70b512bc5cef55cb8314167\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9B\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0117\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF3-\xE4\xB8\xAA\xE4\xBA\xBA\xE5\x9B\x9Bd1fe1d", chain_hash="e4300bd21201a7a093b75f1f01\x80callb", archive_times=-31, callback_status="ckd3cf29", relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card="afc55250e4a8981c67fa24fea6f6eb1b29248fd311ff4dcf2b1bef3c013\x001d2d", curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b0d603e259ddd0851210c0ff31699a289http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x03\x14\xA0", legal_card_type=:NULL, version=2147559427)
    Record 13545: (id=723026)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000061", user_mobile=:NULL, enterprise_id=:NULL, enterprise_code=:NULL, status="init", scene="136", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bee7c7e13b97d5b8a669e882622c484d6", delete_flag="0", raw_add_time="185044806-75-99 90:42:84", raw_update_time="393668119-98-64 75:46:09", user_name="ab3902", enterprise_name=:NULL, user_id_card="af2ac9422b81d53bcfdbe77fa8d19a2be07785d75ee6ec46bd4962d86f\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF20-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C+\xE4\xBA\xBA\xE8\x84\xB8\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0136\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF20-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C+\xE4\xBA\xBA\xE8\x84\xB8\x803\x001d2", chain_hash=:NULL, archive_times=-28, callback_status=:NULL, relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40bee7c7e13b97d5b8a669e882622c484d6http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x04\x14\xA0", legal_card_type=:NULL, version=2147559427)
    Record 14164: (id=723027)(app_id="C-SCF", user_id=:NULL, request_id="SCF20221014000062", user_mobile=:NULL, enterprise_id=:NULL, enterprise_code=:NULL, status="init", scene="136", frontend_url="null&aesToken=1d2d59c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b73b6dbd5646b8471d33a62d66540acd0", delete_flag="0", raw_add_time="185044806-76-33 45:87:16", raw_update_time="393724414-98-18 17:59:21", user_name="ab3902", enterprise_name=:NULL, user_id_card="af2ac9422b81d53bcfdbe77fa8d19a2be07785d75ee6ec46bd4962d86f\xE4\xBE\x9B\xE5\xBA\x94", scene_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF20-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C+\xE4\xBA\xBA\xE8\x84\xB8\xE4\xBE\x9B\xE5\xBA\x94", app_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\xB9\xB3\xE5\x8F\xB0136\xE4\xBE\x9B", flow_parent="\xE5\xBA\x94", flow_parent_name="\xE9\x93\xBE\xE9\x87\x91\xE8\x9E\x8D\xE5\x9C\xBA\xE6\x99\xAF20-\xE4\xB8\xAA\xE4\xBA\xBA\xE4\xBA\x8C+\xE4\xBA\xBA\xE8\x84\xB8\x803\x001d2", chain_hash=:NULL, archive_times=-28, callback_status=:NULL, relation_id=:NULL, enterprise_legeal_id_card=:NULL, enterprise_legeal_name=:NULL, user_bank_card=:NULL, curr_user_is_legeal="5", verify_fail_times=57, aes_token="c56b56da8bb10a87a46130c865d3c3c71bd953eb3ad2f8475fc03e7b2c0a282a3eb11602a18df45b985f2563a5d180fee0329e56b34a835c5d957fc40b73b6dbd5646b8471d33a62d66540acd0http", enterprise_bank_card=:NULL, feature=:NULL, terminal="              \x00\x00\x00\x04\x00\x00", legal_card_type=:NULL, version=0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    目标数据就在这个page上,那么innodb会把整个page从磁盘上读取出来返回给mysql server。

    四 聚集索引 & 二级索引

    在MySQL中,创建一张表时会默认为主键创建聚簇索引,B+树将表中所有的数据组织起来,即数据就是索引主键所以在InnoDB里,主键索引也被称为聚簇索引,索引的叶子节点存的是整行数据。而除了聚簇索引以外的所有索引都称为二级索引,二级索引的叶子节点内容是主键的值。

    • 聚集(一级索引)

      • 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
      • 只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。 如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
    • 非聚集(也称二级索引)

      • 非聚集索引具有独立于数据行的结构。 非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
      • 除了主键索引以外的索引都是非聚集索引

      B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引;如果索引值和行记录分开存放就属于非聚簇索引。

    请添加图片描述

    id(Primary key) 聚集索引Name (key)非聚集索引Companay
    5GatesMicrosoft
    7BezosAmazon
    11JobsApple
    14EllisonOracle

    二级索引的查找过程:二级索引满足查询需求,则直接返回,此时索引即为覆盖索引,反之则需要回表去主键索引(聚簇索引)进行二次查询

    1. 每个二级索引都是一个完整的B+树,因此增加索引要考虑磁盘空间影响,不添加过多的索引和过大的索引(varchar不能全部上索引)。
    2. 为了保证有序性,insert,update,delete语句可能会导致页分裂行为,从而使得性能下降(二级索引越多,影响越大,不鼓励建太多的二级索引)
    3. 建一个(A, B, C)的联合索引,我们能用上(A), (A, B), (A, B, C)索引
    4. like “%search_key” 用不上索引, like “search_key%” 用的上索引
    5. 因为二级索引有回表的操作,所以能用主键索引就用主键索引

    参考资料


    1. https://blog.jcole.us/innodb/ mysqlab 公司第14号员工的innodb系列博客
    2. https://github.com/jeremycole/innodb_ruby innodb底层存储分析工具
    3. 《高性能mysql》
    4. MySQL技术内幕:InnoDB存储引擎(第2版)
  • 相关阅读:
    网络编程常用的几种字符编码
    Nacos注册中心
    【C++杂货铺】探索list的底层实现
    AtCoder Beginner Contest 319(D-G)
    中国各地级市的银行金融机构网点数据(2007-2022年)
    高考学计算机专业的小白指南,一些比较实用的软件,快速入手计算机
    Spring Data JPA使用@DynamicInsert和@DynamicUpdate注解进行动态插入和更新
    多媒体应用设计师 开始
    DC-9靶机
    经管博士科研基础【19】齐次线性方程组
  • 原文地址:https://blog.csdn.net/bruce128/article/details/128066243