mysql面试题九(SQL优化)

目录

1.一条 SQL 是如何执行的

2.索引失效的几种情况

3.EXPLAIN

4.Where 子句如何优化

5.超大分页或深度分页如何处理

6.大表查询如何优化

7.分库分表

基本概念

分库分表方法

水平拆分

垂直拆分

分库分表后的注意事项


1.一条 SQL 是如何执行的

在MySQL中,一条SQL语句从提交到服务器到最终返回结果,会经历一系列复杂的内部处理过程。以下是SQL语句在MySQL中执行的基本步骤概述:

  1. 连接器

    • 客户端应用程序(如数据库管理工具、应用程序代码等)与MySQL服务器建立连接。连接器负责验证用户的登录凭据(用户名、密码),以及与客户端保持通信通道。
  2. 查询缓存(MySQL 8.0之前)

    • 对于SELECT查询(不涉及数据修改的查询),在较早版本的MySQL(如8.0之前的版本)中,连接器会先检查查询缓存。如果查询语句与缓存中的某个条目匹配且数据未过期,查询结果可以直接从缓存返回给客户端,避免了进一步的处理。然而,由于查询缓存的局限性(如易受数据变更影响导致缓存失效、管理成本高等),MySQL 8.0版本及以后已移除了查询缓存功能。
  3. 分析器

    • 如果查询缓存不适用或未命中,MySQL会将接收到的SQL语句交给分析器。分析器首先进行词法分析,将SQL语句拆解成一个个有意义的单词(token),如标识符、关键词、操作符等。接着进行语法分析,根据MySQL的语法规则检查这些单词组成的序列是否符合SQL语法规则。如果SQL语句的语法错误,此时会返回错误信息。
  4. 优化器

    • 通过语法分析的SQL语句,会被优化器接手。优化器负责确定最优的执行计划,即如何最高效地获取所需数据。这包括选择合适的索引、决定表的连接顺序和方式(如Nested Loop Join、Hash Join、Merge Join)、评估是否需要进行全表扫描等。优化器基于统计信息、成本模型等进行决策,旨在最小化查询的执行时间和资源消耗。
  5. 执行器

    • 有了执行计划之后,执行器开始执行查询。它与存储引擎交互,调用相应的接口来访问数据。对于SELECT查询,执行器按计划读取数据并返回给客户端;对于INSERT、UPDATE、DELETE等写操作,执行器会根据计划修改数据,并确保事务的ACID特性得到保证。
  6. 权限校验

    • 在查询执行过程中,尤其是在涉及到特定表或列的操作时,执行器会与系统权限模块协作,检查当前用户是否有执行该操作的权限。如果没有相应权限,查询会被终止,并返回权限错误。
  7. 存储引擎

    • MySQL支持多种存储引擎(如InnoDB、MyISAM等)。执行器与具体的存储引擎交互,执行实际的数据读写操作。存储引擎负责管理数据的物理存储、索引结构、锁机制、事务支持等。
  8. 日志模块

    • 对于涉及数据更改的SQL语句,MySQL会记录相应的日志。例如,InnoDB存储引擎使用redo log(重做日志)保证 crash-safe 能力,binlog(二进制日志)用于复制和备份。这些日志在语句执行过程中或完成后被写入,以确保数据的一致性和可恢复性。
  9. 结果返回与清理

    • 执行完毕后,执行器将查询结果返回给客户端。如果是SELECT查询,结果集可能会被压缩后再传输。完成所有操作后,若连接不再需要,连接器会负责断开连接,释放相关资源。

综上所述,一条SQL语句在MySQL中执行的过程涉及多个组件的协作,包括连接管理、查询解析与优化、权限验证、数据访问、日志记录以及结果返回等环节,确保了SQL语句的正确执行和数据的安全访问。

2.索引失效的几种情况

  1. 数据类型不匹配

    • 当查询条件中的数据类型与索引列的数据类型不一致,或者转换可能导致索引无法精确匹配时,索引可能失效。例如,对整型索引列使用字符串类型的值进行查询,或对日期索引列使用错误的格式。
    • 数据类型出现隐式转化。如 varchar 不加单引号的话可能会自动转换为 int 型,使索引无效,产生全表扫描;
  2. 不遵循最左前缀原则

    • 对于复合索引(包含多个列的索引),查询必须从索引的第一列开始,并按照索引定义的列顺序进行。如果查询条件没有以索引的第一列开头,或者跳过了索引中间的列,索引可能无法被充分利用。
  3. 在索引列上使用 IS NULL 或 IS NOT NULL操作。最好给列设置默认值。
  4. 使用NOT!=<>操作符

    • 对于某些类型的索引(如B树索引),使用NOT!=<>操作符时,MySQL可能无法有效地利用索引进行查询。因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
  5. 使用OR连接多个条件

    • or 语句前后没有同时使用索引。当 or 左右查询字段只有一个是索引,该索引失效,只有左右查询字段均为索引时,才会生效;
  6. 前导模糊查询

    • 使用LIKE操作符进行查询时,如果查询模式以通配符%开头(如LIKE '%value%'),索引通常无法发挥作用,因为这种模式不满足最左前缀匹配原则。
  7. 对索引进行表达式计算或函数操作

    • 如果查询条件包含对索引列进行数学运算、函数调用(如CONCAT()SUBSTRING(),日期函数等)或类型转换,索引通常无法被直接使用,因为索引存储的是原始值而非计算后的结果。
  8. 索引列包含大量重复值

    • 当索引列的值分布非常集中,尤其是存在大量重复值时,即使查询使用了索引列,MySQL可能判断全表扫描比使用索引更为高效
  9. 索引列使用范围查询后紧跟非索引列查询

    • 当索引列使用范围查询(如><BETWEEN等)后,如果紧随其后的查询条件包含未被索引的列,那么索引可能只对范围查询部分有效,后续的查询条件可能导致索引失效。
  10. 索引未被更新或维护

    • 如果数据发生改变(如插入、更新或删除)后,对应的索引没有及时更新,或者索引由于长时间未进行优化(如重建、修复)而导致统计数据过时或索引结构损坏,都可能导致索引无法正常工作。

3.EXPLAIN

EXPLAIN是MySQL提供的一种用于分析SQL查询执行计划的命令。通过在查询语句前添加EXPLAIN关键字,可以获取到MySQL对这条查询的详细执行信息,包括访问哪些表、采用何种连接类型、使用哪些索引、是否进行排序和分组、估计的行数、是否使用临时表等。这些信息有助于理解查询的执行流程,识别潜在性能瓶颈,并据此进行优化。

以下是对EXPLAIN输出结果中各字段的简要解释:

  • id:查询执行的顺序号。相同id表示这部分查询是一个执行单元,从上到下执行。id值越大,执行优先级越高,越先被执行。

  • select_type:查询类型。常见的有SIMPLE(简单查询,无子查询或UNION)、PRIMARY(外部查询,最外层的SELECT)、SUBQUERY(子查询中的第一个SELECT)、DEPENDENT SUBQUERY(子查询依赖于外部查询的结果)、UNION(UNION中的第二个或后续SELECT)等。

  • table:查询涉及的表名。如果查询使用了别名,这里显示的是别名。

  • type:访问类型,即MySQL决定如何查找表中的行。从最优到最差依次为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,最好能尽可能接近"system"或"const"。

  • possible_keys:查询可能使用的索引。如果为空,表示没有可用的索引。

  • key:实际使用的索引。如果没有使用索引,显示为NULL。

  • key_len:使用的索引长度,用于估算索引中使用的字节数。这可以帮助判断是否使用了索引的一部分(前缀索引)或者是否完全使用了索引。

  • ref:哪个列或常量与索引进行了比较。

  • rows:MySQL根据统计信息估算的需要读取的行数。这个值越小越好。

  • filtered(MySQL 5.7.8及以上版本):一个百分比值,表示存储引擎认为需要访问的行数占总行数的比例。结合rows字段,可以更准确地预估查询的实际工作量。

  • Extra:包含其他额外信息,如是否使用了覆盖索引(Using index)、是否使用了临时表(Using temporary)、是否进行了文件排序(Using filesort)、是否进行了全表扫描(Using where; Using index)等。

使用EXPLAIN的示例:

EXPLAIN SELECT * FROM employees e JOIN departments d ON e.dept_id = d.id WHERE e.salary > 50000;

运行上述命令后,MySQL将返回一个表格,展示对查询的执行计划分析结果。通过解读这些信息,可以了解MySQL如何执行查询,识别是否存在全表扫描、未使用索引等问题,进而针对性地优化查询或调整索引策略。

4.Where 子句如何优化

优化WHERE子句是提高SQL查询性能的关键步骤之一。以下是一些建议和策略,帮助您优化WHERE子句以提高查询效率:

  1. 使用索引

    • 确保WHERE子句中涉及的列已被正确索引。对于频繁查询且数据范围筛选明显的列,创建合适的索引(如单列索引、复合索引、全文索引等),并遵循最左前缀原则。使用EXPLAIN分析查询计划,确认索引是否被正确使用。
  2. 避免全表扫描

    • 尽可能减少对大数据表的全表扫描。如果查询条件能限定在一个较小的数据范围内,通过索引快速定位数据,可显著提高查询速度。避免在WHERE子句中使用无法利用索引的操作,如对非索引列的范围查询、非索引列的IN列表查询等。
  3. 简化条件表达式

    • 减少复杂的逻辑表达式和嵌套查询。尽量将OR条件改写为UNIONIN子查询,因为OR可能导致索引失效。避免在WHERE子句中使用否定条件(如NOT IN!=),它们往往难以利用索引。
  4. 避免使用函数和表达式

    • 不要在WHERE子句中对索引列使用函数或表达式,因为这会导致索引失效。如果必须使用函数或表达式,考虑是否能在查询外先计算好值,然后作为常量传入查询。
  5. 合理使用INEXISTS

    • 当需要检查某列值是否在一组值中时,使用IN通常比多次OR条件更高效。对于关联子查询,当只需要判断是否存在匹配记录时,使用EXISTS通常比INJOIN更高效。
  6. 避免在关联查询中使用!=<>

    • 在多表关联查询中,避免在ONWHERE子句中使用!=<>比较关联键,因为这可能导致无法使用索引。改用LEFT JOIN ... IS NULLNOT EXISTS等方法来实现相同的效果。
  7. 减少NULL值的处理

    • NULL值在索引中处理起来较为复杂,可能导致索引部分失效。尽量避免在频繁查询的列中使用NULL,并在设计表结构时考虑使用默认值或空字符串代替。对于必须存在的NULL值,可以创建NULL友好索引(如FULLTEXT索引、SPATIAL索引等)或使用COALESCE()IFNULL()等函数转换为非NULL值进行查询。
  8. 避免在索引列上使用LIKE通配符

    • 对于LIKE查询,尽量避免在索引列上使用前导通配符(如'%value%'),因为这会导致索引失效。如果必须使用LIKE,尝试将通配符置于模式末尾(如'value%'),并确保模式足够短以利用索引。
  9. 批量处理

    • 如果需要对大量数据进行过滤,考虑将多次单个查询合并为一次批量查询,利用INJOIN处理,减少网络通信开销和数据库服务器的压力。
  10. 定期维护索引和统计信息

    • 定期对表进行分析(如ANALYZE TABLE),更新索引统计信息,确保优化器能做出准确的成本估算。定期检查并重建(如OPTIMIZE TABLE)或修复(如REPAIR TABLE)索引,保持索引结构健康。

通过以上策略优化WHERE子句,可以有效提高查询性能,降低数据库服务器负载,提升应用程序响应速度。记得在修改查询后使用EXPLAIN分析查询计划,验证优化效果。

5.超大分页或深度分页如何处理

处理超大分页或深度分页时,由于涉及大量数据的检索和排序,传统基于LIMITOFFSET的分页方式往往会面临性能瓶颈。以下是一些优化超大分页或深度分页的方法:

  1. Keyset(Cursor-Based)分页

    • 使用有序的唯一键或索引来实现分页。首次查询时,获取指定数量的记录以及最后一个记录的排序键值。后续分页时,直接使用这个键值作为起始点进行查询,而不是使用OFFSET。这样可以避免跳跃式读取大量无关数据,显著减少IO和CPU负担。

    示例:

    -- 第一页
    SELECT * FROM table ORDER BY sort_column LIMIT 10;-- 第二页,假设上一页最后一条记录的sort_column值为last_value
    SELECT * FROM table WHERE sort_column > last_value ORDER BY sort_column LIMIT 10;
  2. 优化LIMITOFFSET查询

    • 避免使用大数值的OFFSET。当OFFSET值较大时,可以尝试改写查询,利用索引来直接定位数据。例如,如果表有连续的主键或唯一索引,且数据按主键递增排列,可以利用主键值直接跳过不需要的数据。

    示例:

    -- 原查询:SELECT * FROM table LIMIT 1000000, 10
    -- 优化为:SELECT * FROM table WHERE id > 1000000 LIMIT 10
  3. 利用索引覆盖(Index Covering)

    • 创建覆盖索引来包含查询所需的所有列,使得查询仅需从索引中获取数据,无需回表,从而减少IO。如果查询结果集可以完全由索引提供,性能将大大提升。
  4. 子查询优化

    • 使用子查询预先筛选出需要的记录范围,然后再进行主查询,避免在大表上直接进行排序和分页。

    示例:

    -- 原查询:SELECT * FROM table ORDER BY sort_column LIMIT 1000000, 10
    -- 优化为:SELECT * FROM (SELECT id FROM table ORDER BY sort_column LIMIT 1000000, 10
    ) AS subquery
    JOIN table ON table.id = subquery.id;
  5. 复合索引优化

    • 根据查询条件和排序需求,创建复合索引来同时涵盖筛选条件和排序字段,减少排序开销。
  6. 基于索引的再排序

    • 如果必须对大量数据进行排序,考虑在索引中预先存储排序后的数据,或者在查询时仅对索引进行排序,避免对整个数据集进行排序。
  7. 利用PREPARE语句

    • 对于频繁执行的分页查询,使用PREPARE语句预编译查询计划,可以减少解析和优化的时间。
  8. 数据分片(Sharding)

    • 如果数据规模极其庞大,考虑使用分片技术将数据分散到多个物理节点上。这样,分页查询仅需在单个分片上执行,显著减小数据处理量。
  9. 缓存策略

    • 对于访问频繁且结果集相对固定的分页查询,可以利用缓存(如Redis、Memcached等)存储部分或全部结果,减少数据库查询压力。特别是对于较深的分页,缓存前几页或者最近访问过的页面可以显著提升用户体验。
  10. 应用层面分页

    • 如果业务允许,将分页操作移到应用层面。例如,先获取所有符合条件的ID列表(使用索引来快速获取),然后在应用中进行分页。这种方法适用于数据总量大但实际展示数据量小的场景。

综上所述,处理超大分页或深度分页时,应结合具体业务场景和数据特点,灵活运用上述策略进行优化。关键在于减少不必要的数据访问、排序和传输,以及合理利用索引来加速查询。同时,持续监控查询性能,根据实际情况调整优化措施。

6.大表查询如何优化

可以从分库分表、读写分离以及缓存三个维度分别阐述

7.分库分表

MySQL分库分表是一种数据库水平扩展策略,用于应对随着数据量增长导致单个数据库实例性能瓶颈的问题。分库分表的主要目的是通过将数据分散存储在多个数据库或多个表中,降低单个数据库的压力,提高查询性能、并发处理能力和系统的整体可伸缩性。以下是MySQL分库分表的基本概念、方法和注意事项:

基本概念

  • 分库:将原本存储在单一数据库中的数据,按照一定规则划分到多个独立的数据库中。每个数据库称为一个分片或分库,它们通常部署在不同的服务器或集群上,以实现资源的分布式处理。

  • 分表:在单个数据库内部,将一张大表按照某种规则切分为多个小表,这些小表被称为子表或分表。每个子表存储原表的一部分数据,从而降低单表的数据量和索引大小。

分库分表方法

水平拆分

  • 水平拆分是最常用的分库分表方式,适用于数据量大且表结构相同的场景。将数据行按照某一列(如用户ID、时间戳等)的值进行切分,将不同范围的数据分布到不同的数据库或表中。

    • 哈希分片:根据某一列的值通过哈希函数计算出分布位置,确保数据均匀分布。例如,对用户ID取模,将其映射到不同的数据库或表。

    • 范围分片:按照某一列的值的自然区间(如时间范围、地理位置区域等)划分数据。例如,按年份或月份将订单表拆分为多个表。

    • 列表分片:根据某一列的特定值列表进行分配,适用于数据有明显业务分组的情况。例如,按用户所属的地区或部门划分数据。

垂直拆分

  • 垂直拆分是根据表中列的相关性,将一张包含多种类型数据的大表拆分为多张结构更紧凑的小表,通常用于减少单表的宽度和索引大小。

    • 按业务拆分:将不同业务相关的列分离到不同的表或数据库,如将用户基本信息与用户行为记录分开存储。

    • 按访问频率拆分:将经常一起访问且访问频次较高的列放在同一张表,将访问较少的列放入另一张表。

分库分表后的注意事项

  1. 数据路由:需要设计一套数据路由机制,根据分片规则自动将查询请求发送到正确的数据库或表。这通常通过中间件(如ShardingSphere、MyCat等)或自定义应用逻辑实现。

  2. 跨库/表查询:分库分表后,原本简单的跨表查询可能变为复杂的分布式查询。需要避免或尽量减少这类查询,或者通过应用层拼接、物化视图、分布式查询引擎等方式解决。

  3. 事务处理:分库分表后,跨分片的事务处理变得复杂。可能需要引入分布式事务解决方案(如两阶段提交、柔性事务等)或调整业务逻辑以适应分布式环境下的事务一致性要求。

  4. 数据同步与备份:分库分表后,数据备份和恢复、实时同步等运维操作需要考虑多个数据库或表。可能需要使用专门的数据库复制工具(如MySQL Replication、Percona XtraDB Cluster等)或分布式数据同步框架。

  5. 数据均衡与扩容:随着数据增长,可能需要重新调整分片规则或增加新的分片。这要求分片策略具备良好的可扩展性,并配合数据迁移工具实现数据的动态迁移。

  6. 全局唯一ID生成:在分库分表环境中,需要确保跨分片的主键或其他唯一标识符全局唯一。可以使用雪花算法、UUID、分布式ID生成服务等方案生成唯一ID。

总的来说,MySQL分库分表是一种应对海量数据存储和访问的有效手段,但同时也增加了系统复杂性。实施分库分表时,应充分评估业务需求、数据特性和未来扩展预期,制定合理的分片策略,并配套相应的数据路由、事务处理、运维管理等解决方案。

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

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

相关文章

Flink checkpoint 源码分析- Flink Checkpoint 触发流程分析

序言 最近因为工作需要在阅读flink checkpoint处理机制&#xff0c;学习的过程中记录下来&#xff0c;并分享给大家。也算是学习并记录。 目前公司使用的flink版本为1.11。因此以下的分析都是基于1.11版本来的。 在分享前可以简单对flink checkpoint机制做一个大致的了解。 …

VSCode SSH连接远程主机失败,显示Server status check failed - waiting and retrying

vscode ssh连接远程主机突然连接不上了&#xff0c;终端中显示&#xff1a;Server status check failed - waiting and retrying 但是我用Xshell都可以连接成功&#xff0c;所以不是远程主机的问题&#xff0c;问题出在本地vscode&#xff1b; 现象一&#xff1a; 不停地输入…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板&#xff0c;供大家参考。距离考试还有二十八天&#xff0c;如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发&#xff0c;后端基于java开发&#xff0c;前后端分离部署。整体采用B/S架构&…

STM32 学习13 低功耗模式与唤醒

STM32 学习13 低功耗模式与唤醒 一、介绍1. STM32低功耗模式功能介绍2. 常见的低功耗模式&#xff08;1&#xff09;**睡眠模式 (Sleep Mode)**:&#xff08;2&#xff09;**停止模式 (Stop Mode)**:&#xff08;3&#xff09;**待机模式 (Standby Mode)**: 二、睡眠模式1. 进入…

Golang基础1-基本类型、if、switch、string

基本类型 bool 整数&#xff1a;byte(相当于uint8), rune(相当于int32), int/uint ,int8/uint8 ,int16/uint16 ,int32/uint32 ,int64/uint64 浮点数: float32 ,float64, complex64 ,complex128 array&#xff08;值类型&#xff09;、slice、map、chan&#xff08;引用类型…

西瓜书学习——决策树形状、熵和决策树的本质

文章目录 决策树形状监督学习算法分类与回归 熵信息熵香农熵 (Shannon Entropy) - H(X)联合熵 (Joint Entropy) - H(X, Y)条件熵 (Conditional Entropy) - H(Y|X)互信息 (Mutual Information) - I(X; Y)相对熵 (Relative Entropy) / KL散度 (Kullback-Leibler Divergence) - DK…

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标&#xff0c;将鼠标移动到图标上会看到三个标记 可以使用下载&#xff0c;直接使用&#xff1a; 可以使用css文件使用&#xff1a; 首先点击购物车样式的选项&#xff0c;而后点击下图位置&#xff1a; 点击自己创…

【python笔记】datafram的时间动态可视化 pyecharts地图

import pandas as pd# 假设DataFrame是这样的&#xff1a; df pd.DataFrame({ year: [2014, 2015, 2016, 2014, 2015, 2016, 2014, 2015, 2016], province: [广东省, 广东省, 河南省, 湖南省, 北京市, 北京市, 上海市, 新疆维吾尔自治区, 上海市], values: [100, 150, 75…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

可平滑替代FTP的FTP替代解决方案,具有哪些强大功能?

FTP是一种广泛使用的文件传输协议&#xff0c;主要用于在网络上的计算机之间传输文件。具有以下特点&#xff1a; 1.简单易用&#xff1a;FTP协议相对简单&#xff0c;易于设置和使用&#xff0c;许多操作系统和应用程序都内置了对FTP的支持。 2.广泛的客户端支持&#xff1a…

Vue生命周期都有哪些?

定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom($el)->渲染、更新->渲染&#xff0c;卸载等一系列的过程。el是挂载点如<div id"app"></div>。 Vue的生命周期分为八个阶段 1.beforeCreate…

Spring Data JPA数据批量插入、批量更新真的用对了吗

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 前言 在前两篇文章已经介绍过&#xff0c;在使用Spring Data JPA时&#xff0c;DAO层的Respository通过继承J…

【基础算法总结】双指针算法二

双指针 1.有效三角形的个数2.和为S的两个数字3. 三数之和4.四数之和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.有效三角形的个数 题目…

react实现时钟翻牌效果

需求&#xff1a;随着数字的变动要求有时钟翻动动效 问题&#xff1a;只在加载时有动效 解决方案&#xff1a;通过判断数字改变&#xff08;这里通过新旧数值变动来判断&#xff0c;不贴代码啦&#xff09;&#xff0c;每次变动的时候手动把animationIterationCount设置为inf…

Android --- 网络请求

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP&#xff0c;HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式&#xff08;系统自带的&#xff09;。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient…

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序&#xff0c;其中IDLE、Python.exe都可以用来编写python程序&#xff0c;也可以进行调试&#xff1b;但是比较基础&#xff0c;比较原始&#xff0c;调试不方便&#xff0c;界面也不友好&#xff0c;需要更…

笔记本电脑耗电和发热比较厉害怎么处理

工作中会遇到有同事反馈笔记本电脑耗电和发热比较厉害&#xff0c;主要检查以下几个地方 1、CPU频率 很多人觉得是cpu使用率高就代表电脑跑得快&#xff0c;发热量就大&#xff0c;其实不是的&#xff0c;主要是看的cpu频率&#xff0c;频率越高&#xff0c;电脑发热量越大。如…

Visual Studio中怎样更改Nuget程序包源

场景 Visual Studio 2019 在使用NuGet添加依赖包时&#xff0c;在预览中搜索不到程序包。 排查下NuGet的程序包源为本地。 将程序包源修改下。 实现 在解决方案上右击选择管理解决方案中的NuGet程序包(在 Visual Studio 中打开“工具”>“选项”>“NuGet 包管理器”…

idea上传项目到gitee(码云)

1、打开码云&#xff0c;新建仓库 2、创建 3、这就是创建成功的页面 4、复制仓库地址&#xff0c;后面需要用到 2、打开我们的项目&#xff1a;例如我现在的项目 1、idea创建git仓库 2、选择我们项目文件夹的目录 3、查看文件是否变色&#xff0c;变色表示成功了 4、添加到缓…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…