Mysql SQL优化跟踪来看看是如何优化并决策使用哪个索引或者不适用索引

news2024/11/19 0:48:28

背景

使用索引字段进行筛选数据时,explain查询语句发现MySQL居然没有使用索引,产生疑问,因此决定调查清楚为什么会不用索引,而是走全表扫描
原因调查出的结果是当你要查询的数据量是连续又占整个表五分之一以上那就不会走索引了,因为顺序读取更快,这个五分之一不是绝对的,而是一个经验值,实际上还是需要SQL优化时计算走这个索引耗时和不走这个索引的耗时去比较,会使用最快的一种方式查询数据。
原因是大概知道了,但是还是不够信服,想进一步看一下分别是多少耗时,最后判断使用了索引或者不走索引,因此我们使用优化器跟踪来看一看。

试验

  1. 链接Mysql数据库并选择好数据库
  2. 设置上记录trace
SET optimizer_trace="enabled=on";
  1. 执行要分析的SQL语句
select * from PKSessionHistory where sessionCreateTime >= '2022-11-28 16:00:00'
  1. 查询优化跟踪记录
 select * from information_schema.optimizer_trace;

查询结果

建议使用json工具来查看json,例如utools里的json插件

{
    "steps": [
        {
            "join_preparation": {
                "select#": 1,
                "steps": [
                    {
                        "expanded_query": "/* select#1 */ select `CohabitPKSessionHistory`.`id` AS `id`,`CohabitPKSessionHistory`.`pkSessionId` AS `pkSessionId`,`CohabitPKSessionHistory`.`cohabitSessionId` AS `cohabitSessionId`,`CohabitPKSessionHistory`.`userId` AS `userId`,`CohabitPKSessionHistory`.`objId` AS `objId`,`CohabitPKSessionHistory`.`createTime` AS `createTime`,`CohabitPKSessionHistory`.`ext` AS `ext`,`CohabitPKSessionHistory`.`userScore` AS `userScore`,`CohabitPKSessionHistory`.`objScore` AS `objScore`,`CohabitPKSessionHistory`.`sessionCreateTime` AS `sessionCreateTime`,`CohabitPKSessionHistory`.`sessionEndTime` AS `sessionEndTime`,`CohabitPKSessionHistory`.`expectedSessionEndTime` AS `expectedSessionEndTime`,`CohabitPKSessionHistory`.`expectedPKEndTime` AS `expectedPKEndTime`,`CohabitPKSessionHistory`.`endSource` AS `endSource`,`CohabitPKSessionHistory`.`totalScore` AS `totalScore`,`CohabitPKSessionHistory`.`cohabitType` AS `cohabitType`,`CohabitPKSessionHistory`.`winnerId` AS `winnerId`,`CohabitPKSessionHistory`.`loserId` AS `loserId`,`CohabitPKSessionHistory`.`userRoseScore` AS `userRoseScore`,`CohabitPKSessionHistory`.`objRoseScore` AS `objRoseScore` from `CohabitPKSessionHistory` where (`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')"
                    }
                ]
            }
        },
        {
            "join_optimization": {
                "select#": 1,
                "steps": [
                    {
                        "condition_processing": {
                            "condition": "WHERE",
                            "original_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')",
                            "steps": [
                                {
                                    "transformation": "equality_propagation",
                                    "resulting_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')"
                                },
                                {
                                    "transformation": "constant_propagation",
                                    "resulting_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')"
                                },
                                {
                                    "transformation": "trivial_condition_removal",
                                    "resulting_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')"
                                }
                            ]
                        }
                    },
                    {
                        "substitute_generated_columns": {}
                    },
                    {
                        "table_dependencies": [
                            {
                                "table": "`CohabitPKSessionHistory`",
                                "row_may_be_null": false,
                                "map_bit": 0,
                                "depends_on_map_bits": []
                            }
                        ]
                    },
                    {
                        "ref_optimizer_key_uses": []
                    },
                    {
                        "rows_estimation": [
                            {
                                "table": "`CohabitPKSessionHistory`",
                                "range_analysis": {
                                    "table_scan": {
                                        "rows": 2084,
                                        "cost": 433.9
                                    },
                                    "potential_range_indexes": [
                                        {
                                            "index": "PRIMARY",
                                            "usable": false,
                                            "cause": "not_applicable"
                                        },
                                        {
                                            "index": "idx_sessionCreateTime",
                                            "usable": true,
                                            "key_parts": [
                                                "sessionCreateTime",
                                                "id"
                                            ]
                                        },
                                        {
                                            "index": "idx_sessionCreateTime_totalScore",
                                            "usable": true,
                                            "key_parts": [
                                                "sessionCreateTime",
                                                "totalScore",
                                                "id"
                                            ]
                                        }
                                    ],
                                    "setup_range_conditions": [],
                                    "group_index_range": {
                                        "chosen": false,
                                        "cause": "not_group_by_or_distinct"
                                    },
                                    "analyzing_range_alternatives": {
                                        "range_scan_alternatives": [
                                            {
                                                "index": "idx_sessionCreateTime",
                                                "ranges": [
                                                    "0x99ae790000 <= sessionCreateTime"
                                                ],
                                                "index_dives_for_eq_ranges": true,
                                                "rowid_ordered": false,
                                                "using_mrr": false,
                                                "index_only": false,
                                                "rows": 182,
                                                "cost": 219.41,
                                                "chosen": true
                                            },
                                            {
                                                "index": "idx_sessionCreateTime_totalScore",
                                                "ranges": [
                                                    "0x99ae790000 <= sessionCreateTime"
                                                ],
                                                "index_dives_for_eq_ranges": true,
                                                "rowid_ordered": false,
                                                "using_mrr": false,
                                                "index_only": false,
                                                "rows": 182,
                                                "cost": 219.41,
                                                "chosen": false,
                                                "cause": "cost"
                                            }
                                        ],
                                        "analyzing_roworder_intersect": {
                                            "usable": false,
                                            "cause": "too_few_roworder_scans"
                                        }
                                    },
                                    "chosen_range_access_summary": {
                                        "range_access_plan": {
                                            "type": "range_scan",
                                            "index": "idx_sessionCreateTime",
                                            "rows": 182,
                                            "ranges": [
                                                "0x99ae790000 <= sessionCreateTime"
                                            ]
                                        },
                                        "rows_for_plan": 182,
                                        "cost_for_plan": 219.41,
                                        "chosen": true
                                    }
                                }
                            }
                        ]
                    },
                    {
                        "considered_execution_plans": [
                            {
                                "plan_prefix": [],
                                "table": "`CohabitPKSessionHistory`",
                                "best_access_path": {
                                    "considered_access_paths": [
                                        {
                                            "rows_to_scan": 182,
                                            "access_type": "range",
                                            "range_details": {
                                                "used_index": "idx_sessionCreateTime"
                                            },
                                            "resulting_rows": 182,
                                            "cost": 255.81,
                                            "chosen": true
                                        }
                                    ]
                                },
                                "condition_filtering_pct": 100,
                                "rows_for_plan": 182,
                                "cost_for_plan": 255.81,
                                "chosen": true
                            }
                        ]
                    },
                    {
                        "attaching_conditions_to_tables": {
                            "original_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')",
                            "attached_conditions_computation": [],
                            "attached_conditions_summary": [
                                {
                                    "table": "`CohabitPKSessionHistory`",
                                    "attached": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')"
                                }
                            ]
                        }
                    },
                    {
                        "refine_plan": [
                            {
                                "table": "`CohabitPKSessionHistory`",
                                "pushed_index_condition": "(`CohabitPKSessionHistory`.`sessionCreateTime` >= '2022-11-28 16:00:00')",
                                "table_condition_attached": null
                            }
                        ]
                    }
                ]
            }
        },
        {
            "join_execution": {
                "select#": 1,
                "steps": []
            }
        }
    ]
}

从优化器记录来看,我们两个索引耗时都是219,全表扫描耗时会是419,因此选择了第一个索引。我们可以explain看一下会是一样的结果选择了第一个索引。另外写了using index condition,是使用了索引下推,不了解的可以查阅相关博客看下索引下推,主要是把mysql服务层要做的筛选下推给了存储引擎筛选,减少两层之间传输的数据量,减少IO。

mysql> explain select * from CohabitPKSessionHistory where sessionCreateTime >= '2022-11-28 16:00:00';
+----+-------------+-------------------------+------------+-------+--------------------------------------------------------+-----------------------+---------+------+------+----------+-----------------------+
| id | select_type | table                   | partitions | type  | possible_keys                                          | key                   | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------------------------+------------+-------+--------------------------------------------------------+-----------------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | CohabitPKSessionHistory | NULL       | range | idx_sessionCreateTime,idx_sessionCreateTime_totalScore | idx_sessionCreateTime | 5       | NULL |  183 |   100.00 | Using index condition |
+----+-------------+-------------------------+------------+-------+--------------------------------------------------------+-----------------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.38 sec)

由于该测试表数据量目前只有两千行,因此我们创建一个复制表,留四个字段,先插入大量数据,再构建索引,然后做试验~

  1. 构建表

索引先不要去建,等数据插入完了再建索引,因为插入数据过程中要更改索引,又要IO

create table PkSessionHistoryCopy(
`id` int(20) unsigned NOT NULL AUTO_INCREMENT primary key COMMENT '自增ID',
 `userId` int(11) NOT NULL COMMENT '用户ID,主动方',
  `objId` int(11) NOT NULL COMMENT '用户ID,被动方',
 `sessionCreateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'PK开始时间 '
);
  1. 插入数据

我先从刚那个两千来行的表把数据全部复制进去,然后自己copy自己,数据就会不断翻倍

insert into PkSessionHistoryCopy (userId,objId,sessionCreateTime) select userId,objId,sessionCreateTime from CohabitPKSessionHistory 

每执行一次下面的自己数据量就翻倍,我目前执行到翻倍成两百五十万行数据

insert into PkSessionHistoryCopy (userId,objId,sessionCreateTime) select userId,objId,sessionCreateTime from PkSessionHistoryCopy
  1. 建索引
alter table PkSessionHistoryCopy add index idx_time (sessionCreateTime)
  1. 看下数据量
select * from PkSessionHistoryCopy order by id desc limit 1
iduserIdobjIdsessionCreateTime
251082352089016520891772022-12-05 16:06:59
  1. 开始试验,我们先来下根据索引字段查的这个执行计划
explain select * from PkSessionHistoryCopy where sessionCreateTime >= '2020-01-01 00:00:00';
mysql> explain select * from PkSessionHistoryCopy where sessionCreateTime >= '2020-01-01 00:00:00';
+----+-------------+----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table                | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | PkSessionHistoryCopy | NULL       | ALL  | idx_time      | NULL | NULL    | NULL | 2264381 |    50.00 | Using where |
+----+-------------+----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.04 sec)

我们可以看到结果显示不会走索引,为啥呢,我们看下优化器跟踪

select * from information_schema.optimizer_trace;
{
    "steps": [
        {
            "join_preparation": {
                "select#": 1,
                "steps": [
                    {
                        "expanded_query": "/* select#1 */ select `PkSessionHistoryCopy`.`id` AS `id`,`PkSessionHistoryCopy`.`userId` AS `userId`,`PkSessionHistoryCopy`.`objId` AS `objId`,`PkSessionHistoryCopy`.`sessionCreateTime` AS `sessionCreateTime` from `PkSessionHistoryCopy` where (`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')"
                    }
                ]
            }
        },
        {
            "join_optimization": {
                "select#": 1,
                "steps": [
                    {
                        "condition_processing": {
                            "condition": "WHERE",
                            "original_condition": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')",
                            "steps": [
                                {
                                    "transformation": "equality_propagation",
                                    "resulting_condition": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')"
                                },
                                {
                                    "transformation": "constant_propagation",
                                    "resulting_condition": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')"
                                },
                                {
                                    "transformation": "trivial_condition_removal",
                                    "resulting_condition": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')"
                                }
                            ]
                        }
                    },
                    {
                        "substitute_generated_columns": {}
                    },
                    {
                        "table_dependencies": [
                            {
                                "table": "`PkSessionHistoryCopy`",
                                "row_may_be_null": false,
                                "map_bit": 0,
                                "depends_on_map_bits": []
                            }
                        ]
                    },
                    {
                        "ref_optimizer_key_uses": []
                    },
                    {
                        "rows_estimation": [
                            {
                                "table": "`PkSessionHistoryCopy`",
                                "range_analysis": {
                                    "table_scan": {
                                        "rows": 2264381,
                                        "cost": 458228
                                    },
                                    "potential_range_indexes": [
                                        {
                                            "index": "PRIMARY",
                                            "usable": false,
                                            "cause": "not_applicable"
                                        },
                                        {
                                            "index": "idx_time",
                                            "usable": true,
                                            "key_parts": [
                                                "sessionCreateTime",
                                                "id"
                                            ]
                                        }
                                    ],
                                    "setup_range_conditions": [],
                                    "group_index_range": {
                                        "chosen": false,
                                        "cause": "not_group_by_or_distinct"
                                    },
                                    "analyzing_range_alternatives": {
                                        "range_scan_alternatives": [
                                            {
                                                "index": "idx_time",
                                                "ranges": [
                                                    "0x99a5420000 <= sessionCreateTime"
                                                ],
                                                "index_dives_for_eq_ranges": true,
                                                "rowid_ordered": false,
                                                "using_mrr": false,
                                                "index_only": false,
                                                "rows": 1132190,
                                                "cost": 1.36e6,
                                                "chosen": false,
                                                "cause": "cost"
                                            }
                                        ],
                                        "analyzing_roworder_intersect": {
                                            "usable": false,
                                            "cause": "too_few_roworder_scans"
                                        }
                                    }
                                }
                            }
                        ]
                    },
                    {
                        "considered_execution_plans": [
                            {
                                "plan_prefix": [],
                                "table": "`PkSessionHistoryCopy`",
                                "best_access_path": {
                                    "considered_access_paths": [
                                        {
                                            "rows_to_scan": 2264381,
                                            "access_type": "scan",
                                            "resulting_rows": 1.13e6,
                                            "cost": 458226,
                                            "chosen": true
                                        }
                                    ]
                                },
                                "condition_filtering_pct": 100,
                                "rows_for_plan": 1.13e6,
                                "cost_for_plan": 458226,
                                "chosen": true
                            }
                        ]
                    },
                    {
                        "attaching_conditions_to_tables": {
                            "original_condition": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')",
                            "attached_conditions_computation": [],
                            "attached_conditions_summary": [
                                {
                                    "table": "`PkSessionHistoryCopy`",
                                    "attached": "(`PkSessionHistoryCopy`.`sessionCreateTime` >= '2020-01-01 00:00:00')"
                                }
                            ]
                        }
                    },
                    {
                        "refine_plan": [
                            {
                                "table": "`PkSessionHistoryCopy`"
                            }
                        ]
                    }
                ]
            }
        },
        {
            "join_explain": {
                "select#": 1,
                "steps": []
            }
        }
    ]
}

我们可以看到全表扫描的cost花费是458228,扫描了2264381行
在这里插入图片描述
再看我们走索引的耗时情况,扫描行数1132190,耗时1.36e6,也就是1360000,是不是比458228多多了,因此我们可以看到写着chosen:false,意思是选择:否,也就是不选这个索引。cause:cost原因是时间消耗更多
在这里插入图片描述
那数据量多少的时候又能走索引更高效呢

explain select * from PkSessionHistoryCopy where sessionCreateTime >= '2022-11-29 00:00:00';
+----+-------------+----------------------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
| id | select_type | table                | partitions | type  | possible_keys | key      | key_len | ref  | rows   | filtered | Extra                 |
+----+-------------+----------------------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
|  1 | SIMPLE      | PkSessionHistoryCopy | NULL       | range | idx_time      | idx_time | 5       | NULL | 283980 |   100.00 | Using index condition |
+----+-------------+----------------------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
1 row in set, 1 warning (0.04 sec)
mysql> select count(*) from PkSessionHistoryCopy where sessionCreateTime >= '2022-11-29 00:00:00';
+----------+
| count(*) |
+----------+
|   145408 |
+----------+
1 row in set (0.06 sec)

这个日期是我试出来的这天,然后我们看一下占比发现是百分之六,所以网络上说的百分之二十、五分之一以上的说法,其实也未必准,实际操作还是得先explain去算一下两种的耗时看一下会不会选择索引。
还有一种办法让他高效走索引,就是加limit,限制查询的数据条数,这样直接走索引查出那些页的数据即可,比扫描全表更高效,从这次试验我们也可以看出,不是你建了索引并且用索引字段筛选就一定走索引的,他还是会在优化时计算每种方式的耗时,选择最优的,另外如果你用覆盖索引、limit减少数据量也是可以优化速度的。

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

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

相关文章

Java面试宝典.exe程序成功运行,经典 Java 万字笔记,查漏补缺,备战跳槽面试

现在 java 的面试真的卷到家了&#xff0c;面试前很有必要针对性的多刷题&#xff0c;大部分童鞋实战能力强&#xff0c;理论不行&#xff0c;面试前不做准备很吃亏。这里整理了很多常考面试题&#xff0c;希望对你有帮助。 耗时一个月&#xff0c;我把牛客网上最火的 Java 面…

ZMQ之共享键值缓存(克隆模式)

发布-订阅模式和无线电广播有些类似&#xff0c;在你收听之前发送的消息你将无从得知&#xff0c;收到消息的多少又会取决于你的接收能力。让人吃惊的是&#xff0c;对于那些追求完美的工程师来说&#xff0c;这种机器恰恰符合他们的需求&#xff0c;且广为传播&#xff0c;成为…

导出 txt文件 处理思路和实现流程

1.先看导出目标文件需要的字段都存不存在&#xff0c; 存在继续处理&#xff0c;不存在就添加。 例如&#xff0c;我这里需要在若依的用户表在添加一个银行账户数据&#xff0c; //银行卡号 private String accountNumber; public String getAccountNumber() { r…

Java程序员3个月从月薪6k涨到15k,你知道我是怎么过来的吗?

(一). 基础 1. Java 基本功 Java 入门&#xff08;基础概念与常识&#xff09; Java 语法 基本数据类型 方法&#xff08;函数&#xff09; 2. Java 面向对象 类和对象 面向对象三大特征 修饰符 接口和抽象类 其它重要知识点 3. Java 核心技术 集合 异常 多线程 文…

Python——协程(Coroutine),异步IO

目录 生成器(Generator) yield表达式的使用 生产者和消费者模型 ​编辑 yield from表达式 协程(Coroutine) asyncio.coroutine async/await 总结 由于GIL的存在&#xff0c;导致Python多线程性能甚至比单线程更糟。 于是出现了协程&#xff08;Coroutine&#xff09;这…

Arduino UNO通过PCF8574串行IIC接口驱动LCD1602/LCD2004液晶屏

LCD1602/2004液晶屏简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。可以显示2行每行16个字符&#xff0c;总共32个字符。字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD&#xff0c;常用161&#xff0c;162&#xff0c;202和402等的模块。不…

Go编程项目实战教程

Go编程项目实战教程 在这个面向初学者的 Go 编程语言课程中&#xff0c;您将通过构建 11 个项目来提高您的 Go 编程技能 课程英文名&#xff1a;Learn Go Programming by Building 11 Projects – Full Course 此视频教程共21.0小时&#xff0c;中英双语字幕&#xff0c;画质…

数据之道读书笔记-07打造“数字孪生”的数据全量感知能力

数据之道读书笔记-07打造“数字孪生”的数据全量感知能力 在信息化时代构建的IT系统&#xff0c;基本上是功能化、烟囱化、封闭式的&#xff0c;只能给企业内部经过培训的专业人员使用&#xff0c;所有的决策数据和我们信任的IT系统基本都是靠人来录入数据。但是&#xff0c;人…

Android移动开发基础——实训项目:个人财务软件

目录 步骤 1. 项目计划 需求分析 程序流程图 2. 实现功能模块 2.1 登录模块 前提 软件&#xff1a;Android Studio开发工具、JDK1.8以上版本 目标&#xff1a;编写个人财务软件 步骤 &#xff08;1&#xff09;根据设计题目要求的指标&#xff0c;通过查阅有关资料…

某学生宿舍楼设计

目 录 1.建筑设计部分 1 1.1工程概况 1 1.2设计依据 2 1.3标高及建筑细部作法 2 1.4平面设计 2 1.4.1建筑方案设计 2 1.4.2建筑做法 4 1.4.3 建筑设计成果 6 2.结构设计部分 7 2.1结构平面设计 7 2.2构件截面尺寸的初步确定 8 2.3荷载统计 10 2.3.1楼屋面及卫生间恒活计算 10 2…

热加载技术:修改Python代码并实时查看结果 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; Python3◉技能提升系列&#xff1a;https://www.showmeai.tech/tutorials/56 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/406 &#x1f4e2; 声明&#xff1a;版权所有&#xf…

基于MindSpore框架的道路场景语义分割方法研究

概述 本文以华为最新国产深度学习框架Mindspore为基础&#xff0c;将城市道路下的实况图片解析作为任务背景&#xff0c;以复杂城市道路进行高精度的语义分割为任务目标&#xff0c;对上述难处进行探究并提出相应方案&#xff0c;成功地在Cityscapes数据集上完成了语义分割任务…

vue3+ts做echarts做一个简单的折线渐变图

vue3做echarts做一个简单的折线渐变图 效果 代码&#xff1a; </template> <div><div class"date-change"><el-date-picker size"small" v-model"dateValue" value-format"YYYY-MM-DD" type"daterange&qu…

Leetcode 72. 编辑距离

最近在写dp问题的时候&#xff0c;写到这个经典题&#xff0c;对于里面三个转换方程没太懂&#xff0c;偶然在评论区找到一个非常非常清楚的解释&#xff0c;顺便就把这道题记录一下&#xff0c;加上自己的理解&#xff0c;方便日后查看! 对于这一类的dp习惯性的都初始化dp的大…

好用的数据恢复软件EasyRecovery2023最新版

实用的数据恢复软件有什么&#xff1f;电脑中的数据文件对很多的小伙伴来说都是非常重要的&#xff0c;在下载安装新的软件设备时都需要非常谨慎&#xff0c;一旦碰到一些病毒就可能会导致文件丢失&#xff0c;想要恢复这些文件并不是很容易&#xff0c;需要使用专业的数据恢复…

proxy

let obj new Proxy({},{get: function(target,propKey,receiver) {console.log(获取的时候会被拦截)console.log(target,propKey,receiver)return Reflect.get(target,propKey,receiver)},set: function(target,propKey,value,receiver) {console.log(设置时被拦截);console.l…

Java开发:JVM篇-类加载内存分析

一、类加载器 A、类加载器的作用 将class文件字节码内容加载到内存中&#xff0c;并将这些静态数据结构转换成方法区的运行时数据结构&#xff0c;然后在堆中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区中类数据的访问入口。 B、类缓存 标准的JavaSE类…

收到公安部门的致谢信,顶象业务安全“反诈”再接再厉

12月1日&#xff0c;《反电信网络诈骗法》正式施行&#xff0c;为反电信网络诈骗工作提供有力法律支撑。自2021年以来&#xff0c;顶象业务安全情报通过多渠道的风险数据以及多维度深度挖掘与分析&#xff0c;助力对电信诈骗分子的精准防控&#xff0c;已为多个监管机构的反电信…

小程序开发--- 03组件

小程序中组件的分类主要有以下9类&#xff1a; 常用的视图容器类是组件有&#xff1a; 1.view : 这是普通的视图区域&#xff0c;类似于HTML中的div&#xff0c;是一个块级元素&#xff0c;常用来实现页面的布局效果 2. scroll-view: 是一个可以上下或者左右滚动的区域&#x…

数据结构—set集合

文章目录一、HashSet集合1.HashSet集合的特点2.HashSet常用方法二、LinkedHashSet集合LinkedHashSet集合的特点三、TreeSet集合1.TreeSet集合的特点2.TreeSet的基本使用四、HashSet、LinkedHashSet、TreeSet的使用场景HashSet:LinkedHashSet&#xff1a;TreeSet:五、list和set集…