架构面试-数据库优化问题

文章目录

  • 如何定位慢查询
      • 1. 开启慢查询日志
        • MySQL示例:
        • PostgreSQL示例:
      • 2. 分析慢查询日志
        • MySQL:
        • PostgreSQL:
      • 3. 使用数据库性能工具
        • MySQL:
        • PostgreSQL:
      • 4. 优化慢查询
      • 5. 监控与持续优化
  • sql语句执行的很慢,如何分析
      • 1. 查看执行计划(EXPLAIN)
        • MySQL 示例:
        • PostgreSQL 示例:
      • 2. 检查索引
      • 3. 分析表统计信息
        • MySQL 示例:
        • PostgreSQL 示例:
      • 4. 检查查询语法
      • 5. 使用慢查询日志
      • 6. 分析数据库性能
      • 7. 使用数据库监控工具
      • 8. 查询优化
      • 9. 系统级优化
      • 10. 持续监控与调优
  • 索引概念及索引底层数据结构
      • 索引的概念
      • 索引的作用
      • 索引的底层数据结构
      • 索引的选择与使用
  • 聚簇索引和非聚簇索引、回表查询
      • 聚簇索引(Clustered Index)与非聚簇索引(Non-Clustered Index)
        • 聚簇索引(Clustered Index)
        • 非聚簇索引(Non-Clustered Index)
      • 回表查询(Index Lookup)
      • 总结
  • 覆盖索引、超大分页优化
      • 覆盖索引(Covering Index)
        • 如何创建覆盖索引
      • 超大分页优化
        • 优化方法:基于主键或排序字段的分页
        • 优化方法:使用覆盖索引
        • 优化方法:预加载
      • 总结
  • 索引创建的原则
  • 什么情况下索引会失效
  • 谈一谈你对sql优化的经验

如何定位慢查询

定位慢查询是数据库优化的关键步骤,尤其是对于关系型数据库如MySQL、PostgreSQL等。以下是定位和优化慢查询的一般步骤:

1. 开启慢查询日志

大多数关系型数据库都支持慢查询日志功能,这可以帮助记录执行时间超过设定阈值的SQL语句。首先,你需要确保慢查询日志已经被开启。

MySQL示例:
  • my.cnfmy.ini配置文件中添加或修改以下行:

    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 2
    

    其中long_query_time定义了慢查询的阈值(秒),即执行时间超过2秒的查询会被记录到日志中。

PostgreSQL示例:
  • postgresql.conf配置文件中添加或修改以下行:
    log_min_duration_statement = 2000  # 单位为毫秒,记录执行时间超过2秒的查询
    logging_collector = on
    log_directory = 'pg_log'
    

2. 分析慢查询日志

一旦慢查询日志被开启并记录了一段时间,你就可以开始分析日志文件,找出具体的慢查询语句。

MySQL:
  • 使用mysqldumpslow工具来分析慢查询日志,例如:
    mysqldumpslow --input-log=/var/log/mysql/slow.log
    
PostgreSQL:
  • 可以直接阅读日志文件,或者使用第三方工具如pgBadger来解析和分析日志。

3. 使用数据库性能工具

除了日志分析,还可以利用数据库自带的性能监控工具。

MySQL:
  • SHOW PROCESSLIST;SHOW FULL PROCESSLIST; 命令可以查看当前正在运行的查询。
  • EXPLAIN SQL语句可以分析查询计划,帮助理解查询的执行效率。
PostgreSQL:
  • pg_stat_activity 视图提供了关于当前活动会话的信息。
  • EXPLAIN (ANALYZE, BUFFERS) 可以查看查询的实际执行情况和缓存使用。

4. 优化慢查询

基于上述分析,你可以采取以下措施优化慢查询:

  • 索引优化:为经常用于查询条件的列创建索引,确保索引选择性和唯一性。
  • 查询优化:避免全表扫描,减少JOIN操作,使用更有效的连接类型,如INNER JOIN代替LEFT JOIN当可能时。
  • 分页优化:如果查询涉及大量数据的分页,考虑使用LIMIT OFFSET的替代方案,如基于ID的分页。
  • 硬件升级:增加内存、使用更快的硬盘或SSD,或者增加计算资源。
  • 数据库架构调整:考虑数据库分区、读写分离等高级策略。

5. 监控与持续优化

优化后,继续监控数据库性能和慢查询日志,确保优化效果,并及时发现新的性能瓶颈。

通过以上步骤,你可以有效地定位和解决数据库中的慢查询问题,从而提升整体系统性能。

sql语句执行的很慢,如何分析

当遇到SQL语句执行缓慢的问题时,可以采用以下步骤进行详细的分析和诊断:

1. 查看执行计划(EXPLAIN)

使用EXPLAIN关键字来分析SQL语句的执行计划。这将显示数据库如何执行查询,包括表的扫描方式、索引的使用情况、连接类型等信息。

MySQL 示例:
EXPLAIN SELECT * FROM table_name WHERE condition;
PostgreSQL 示例:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM table_name WHERE condition;

2. 检查索引

检查是否使用了合适的索引,以及索引是否被有效地利用。如果查询涉及复杂的JOIN操作或WHERE子句,可能需要添加复合索引或重新考虑索引设计。

3. 分析表统计信息

运行ANALYZE命令更新表统计信息,确保数据库优化器有最新的数据分布信息。

MySQL 示例:
ANALYZE TABLE table_name;
PostgreSQL 示例:
VACUUM ANALYZE table_name;

4. 检查查询语法

  • 确保SELECT语句只选择了真正需要的列,避免使用SELECT *
  • 确保WHERE子句中的条件尽可能具体,避免全表扫描。
  • 检查是否存在不必要的子查询或嵌套查询。

5. 使用慢查询日志

启用并检查慢查询日志,找到执行时间过长的查询。这有助于识别模式并确定优化的重点。

6. 分析数据库性能

  • 检查数据库的CPU和I/O使用情况,确定瓶颈。
  • 监控数据库的缓冲池和缓存使用情况,确保足够的内存用于缓存数据和索引。

7. 使用数据库监控工具

许多数据库管理系统提供了内置的监控工具,如pg_stat_activity(PostgreSQL)、SHOW PROCESSLIST(MySQL)等,可以查看当前正在运行的查询及其状态。

8. 查询优化

根据上述分析的结果,优化查询,可能包括:

  • 重构查询逻辑。
  • 添加或修改索引。
  • 分区大表。
  • 调整数据库配置参数,如缓存大小、连接数等。

9. 系统级优化

  • 升级硬件,如增加内存、使用SSD等。
  • 调整操作系统级别的设置,如文件系统缓存、I/O调度器等。

10. 持续监控与调优

优化后,持续监控查询性能,确保改进的效果,并随时准备调整以适应系统的变化。

通过这些步骤,可以系统地分析和解决SQL语句执行缓慢的问题,提高数据库的性能和响应速度。

索引概念及索引底层数据结构

索引的概念

索引是数据库中的一种数据结构,它类似于图书的目录,用于快速定位数据。没有索引的情况下,数据库必须从第一条记录开始逐条查找,直到找到所有满足条件的记录为止,这种搜索方式称为全表扫描,效率低下。索引可以极大地提高数据检索的速度,尤其是在处理大数据量和复杂查询时。

索引的作用

  1. 加速数据检索:索引可以减少数据库的I/O操作次数,从而加快查询速度。
  2. 辅助排序和分组:在执行ORDER BY和GROUP BY操作时,索引可以避免全表扫描,提高排序和分组的效率。
  3. 唯一性约束:某些类型的索引(如唯一索引)可以保证数据的唯一性,防止插入重复的记录。

索引的底层数据结构

数据库中常用的索引数据结构主要有以下几种:

  1. B树(B-Tree)

    • B树是一种自平衡的树结构,非常适合磁盘等存储设备,因为它可以减少磁盘的I/O次数。B树的每一个节点可以有多个子节点,且节点内存储的数据量较大,这使得B树的高度相对较小,从而减少了查询时的磁盘访问次数。
    • MySQL的InnoDB存储引擎使用B树作为索引结构。
  2. B+树(B-Plus Tree)

    • B+树是B树的一种变体,它的所有数据都存储在叶子节点上,非叶子节点只用于索引。这种结构使得B+树在进行范围查询时更为高效,因为所有数据都在同一层,可以顺序访问。
    • B+树也是MySQL InnoDB存储引擎的主要索引结构。
  3. 哈希索引(Hash Index)

    • 哈希索引使用哈希函数将键映射到特定的位置,以实现快速查找。哈希索引最适合等值查询,但在处理范围查询和排序时效率不高,因为哈希表不具备顺序性。
    • MySQL的MEMORY存储引擎支持哈希索引。
  4. 位图索引(Bitmap Index)

    • 位图索引主要用于低基数的列(即列中不同值的数量很少),它可以非常高效地存储和查询数据,但随着列基数的增加,位图索引的效率会迅速下降。
  5. R树(R-Tree)

    • R树是多维数据的索引结构,常用于地理信息系统(GIS)中处理空间数据的查询。

索引的选择与使用

不同的数据库系统可能支持不同的索引类型,选择哪种索引取决于数据的特点和查询的需求。例如,对于频繁进行范围查询的列,B+树是一个好的选择;而对于需要快速查找固定值的列,哈希索引可能更合适。在设计数据库时,合理地使用索引可以显著提高查询性能,但过多或不恰当的索引也会增加写操作的成本,因此需要权衡利弊。

聚簇索引和非聚簇索引、回表查询

聚簇索引(Clustered Index)与非聚簇索引(Non-Clustered Index)

在数据库中,索引的类型可以大致分为聚簇索引和非聚簇索引。这两者的根本区别在于数据的物理存储方式和索引的结构。

聚簇索引(Clustered Index)
  • 定义:聚簇索引决定了表中数据的物理存储顺序。换句话说,数据行在磁盘上的排列顺序就是聚簇索引的顺序。一个表只能有一个聚簇索引,因为数据本身只能有一种物理存储顺序。
  • 数据存储:在聚簇索引中,索引的叶节点包含了完整的数据行。例如,InnoDB存储引擎中,表数据是以聚簇索引的方式存储的,默认使用主键作为聚簇索引。
  • 查询效率:对于基于聚簇索引的查询,可以直接定位到数据行,而不需要额外的查找,因此查询效率较高。
非聚簇索引(Non-Clustered Index)
  • 定义:非聚簇索引的结构与聚簇索引不同,它并不决定数据的物理存储顺序。非聚簇索引的叶节点存储的是指向数据行的指针,而不是数据行本身。
  • 数据存储:非聚簇索引的叶节点包含索引键值和指向数据行的指针。由于数据行本身并不存储在非聚簇索引中,所以一个表可以有多个非聚簇索引。
  • 查询效率:使用非聚簇索引查询时,如果索引中不包含查询所需的所有列,就需要通过索引中的指针去访问实际的数据行,这个过程称为回表查询(Index Lookup),会增加额外的I/O操作,降低查询效率。

回表查询(Index Lookup)

  • 定义:回表查询是指在使用非聚簇索引进行查询时,索引中不包含查询所需的所有列信息,因此需要根据索引中的指针回到数据行中获取额外的信息。这个过程会增加额外的磁盘I/O操作,从而影响查询性能。
  • 避免回表查询:为了减少回表查询,可以考虑在非聚簇索引中包含更多的列(也称为覆盖索引或索引包含),只要这些列能够满足大部分查询需求。这样,查询时可以直接从索引中获取所有需要的数据,而无需回表。

总结

聚簇索引和非聚簇索引的选择和使用取决于具体的应用场景和查询需求。聚簇索引提供了更好的查询性能,但限制了数据的物理存储顺序;非聚簇索引提供了更大的灵活性,但可能引入回表查询。在设计数据库索引时,需要根据数据特性和查询模式来合理选择和优化索引结构。

覆盖索引、超大分页优化

覆盖索引(Covering Index)

覆盖索引是指索引中包含了查询所需要的所有列,因此在查询时,数据库不需要再回到表的数据行中去获取额外的信息,从而避免了回表查询(Index Lookup)。这可以显著减少磁盘I/O操作,提高查询效率,尤其是在查询涉及的列较少,但数据量很大的情况下。

如何创建覆盖索引

假设有一个名为orders的表,其结构如下:

CREATE TABLE orders (id INT PRIMARY KEY,customer_id INT,order_date DATE,product VARCHAR(100),price DECIMAL(10, 2)
);

如果经常执行如下查询:

SELECT customer_id, order_date, product FROM orders WHERE customer_id = 123;

则可以创建一个覆盖索引:

CREATE INDEX idx_orders ON orders(customer_id, order_date, product);

这样,对于上述查询,数据库可以直接从索引中获取customer_idorder_dateproduct,而无需访问实际的数据行。

超大分页优化

在处理超大分页查询时,传统的OFFSET N LIMIT M方法会变得非常低效,因为它需要先跳过N条记录,然后再获取M条记录。对于大数据量的表,这会导致大量的数据读取和排序操作,消耗大量的CPU和I/O资源。

优化方法:基于主键或排序字段的分页

一种更高效的分页策略是基于主键或其他排序字段进行分页,而不是使用OFFSET。例如,假设我们有一个博客文章表posts,按照id排序,我们可以使用如下查询:

SELECT * FROM posts WHERE id < 1000 ORDER BY id DESC LIMIT 10;

这将返回id小于1000的最后10篇文章。在下一页中,我们可以使用上一页的最大id作为起始点,例如:

SELECT * FROM posts WHERE id < 990 ORDER BY id DESC LIMIT 10;

其中990是上一页中最小的id值。

优化方法:使用覆盖索引

如果分页查询只需要部分列,可以创建一个包含这些列的覆盖索引,以减少查询的I/O操作。

优化方法:预加载

对于固定数量的分页查询,可以预先加载一定范围内的数据,然后在客户端进行分页,避免每次分页请求都要进行数据库查询。

总结

覆盖索引和超大分页优化都是提高数据库查询效率的重要手段。覆盖索引通过减少回表查询,降低了I/O开销;而超大分页优化通过改变分页策略,避免了大量数据的无谓读取和排序,两者都可以显著提升数据库的性能表现。在设计数据库查询和优化时,应根据具体的应用场景和查询需求,灵活运用这些优化技巧。

索引创建的原则

创建索引是数据库优化的重要组成部分,合理的索引设计可以显著提升查询性能。但是,索引并不是越多越好,过多的索引会增加写入操作的开销,占用更多存储空间。以下是创建索引时应遵循的一些基本原则:

  1. 最频繁查询的列

    • 对于查询中经常用作筛选条件的列,创建索引可以显著提高查询速度。
    • 特别是那些出现在WHERE子句中的列,以及用于JOIN操作的列。
  2. 高选择性列

    • 选择性高的列,即具有较少重复值的列,更适合创建索引。这可以确保索引的有效性,避免过多的I/O操作。
    • 主键通常具有最高选择性,因此是创建索引的首选。
  3. 覆盖索引

    • 创建包含查询中所有列的索引,可以避免回表查询,减少I/O操作。
    • 但要注意,覆盖索引不应包含太多列,否则会增加索引的维护成本。
  4. 避免对低基数列创建索引

    • 低基数列,即重复值很多的列,创建索引的效果不佳,甚至可能导致查询性能下降。
  5. 考虑索引的维护成本

    • 插入、更新和删除操作需要维护索引,因此,对于写操作频繁的列,应谨慎创建索引。
    • 对于大量写操作的表,可以考虑使用延迟索引更新或批量更新策略。
  6. 多列索引的顺序

    • 多列索引中列的顺序很重要,应根据查询模式来确定。最常用于筛选的列应放在前面。
    • 例如,如果查询经常使用WHERE country = 'US' AND city = 'New York',则应创建(country, city)的索引,而不是(city, country)
  7. 使用最短有效的列

    • 如果列的值很长,可以考虑创建前缀索引,仅索引列值的一部分,但这可能会影响索引的选择性。
  8. 定期分析和维护索引

    • 使用ANALYZE TABLE等命令定期更新统计信息,确保数据库优化器可以做出正确的决策。
    • 定期检查和调整索引,移除不再使用的索引,避免冗余索引。
  9. 考虑数据库特性

    • 不同的数据库系统可能有不同的索引实现和优化策略,创建索引时应参考具体数据库的文档和最佳实践。
  10. 测试和监控

    • 创建索引后,应通过测试和监控来评估其性能影响,确保索引达到了预期的优化效果。

记住,索引设计是一个平衡的过程,需要在查询性能、写入性能、存储空间和维护成本之间找到最优解。在实际应用中,应根据具体的工作负载和业务需求,灵活调整索引策略。

什么情况下索引会失效

索引在数据库查询优化中扮演着至关重要的角色,但在某些情况下,数据库优化器可能不会使用索引,导致索引失效。以下是一些常见的索引失效情形:

  1. 使用不等于操作符

    • 当查询条件使用!=<>操作符时,数据库很难利用索引来排除不匹配的行,因此索引可能不会被使用。
  2. 使用通配符搜索

    • 当LIKE语句的通配符%位于搜索模式的开头时,如LIKE '%search_text%',数据库无法有效地利用索引,因为索引是按顺序存储的,这样的查询可能需要全表扫描。
    • 但如果通配符位于搜索模式的末尾,如LIKE 'search_text%',索引仍然可以被利用。
  3. 在索引列上使用函数

    • 如果查询条件中包含对索引列使用函数,如WHERE UPPER(column_name) = 'VALUE',数据库将无法直接使用索引,因为索引存储的是列的原始值,而不是函数处理后的值。
  4. 使用OR操作符连接非等价条件

    • OR操作符连接的条件中至少有一个不能使用索引时,整个查询可能都不会使用索引。例如,WHERE col1 = value1 OR col2 LIKE '%value2%',其中col2 LIKE '%value2%'导致索引失效,可能影响整个查询的性能。
  5. 查询条件中使用变量

    • 如果查询条件中的值是通过变量传递的,如WHERE column_name = ?,在某些情况下,数据库优化器可能无法有效利用索引。这是因为优化器需要知道具体的值来决定是否使用索引。
  6. 显式禁用索引

    • 在某些数据库中,可以显式地禁用索引,如FORCE INDEX (idx_name)IGNORE INDEX (idx_name),这通常用于调试或强制使用特定的查询计划。
  7. 索引选择性差

    • 如果索引的选择性较差,即索引列的值分布不均,数据库优化器可能认为全表扫描比使用索引更有效率。
  8. 索引列数据类型不匹配

    • 如果查询条件和索引列的数据类型不一致,如使用字符串与数值比较,索引可能不会被使用。
  9. 统计信息过时

    • 如果表的统计信息没有及时更新,数据库优化器可能无法准确估计使用索引的成本,从而导致索引失效。

为了避免索引失效,应尽量避免上述情况的发生,并定期分析和优化索引策略,确保索引能够有效地支持查询需求。在设计查询和创建索引时,应充分考虑数据库优化器的行为和索引的使用条件。

谈一谈你对sql优化的经验

SQL优化是数据库管理和应用开发中不可或缺的一部分,旨在提高查询效率,减少资源消耗,提升系统整体性能。以下是我对SQL优化的一些经验和建议:

  1. 理解查询计划

    • 使用EXPLAIN语句来查看查询的执行计划,理解数据库如何执行查询,识别性能瓶颈。
    • 关注EXPLAIN输出中的possible_keyskeyrowsExtra等列,它们可以帮助你了解索引使用情况和预计扫描行数。
  2. 合理使用索引

    • 为频繁用于WHERE子句和JOIN操作的列创建索引。
    • 创建多列索引时,根据查询模式确定列的顺序。
    • 使用覆盖索引来避免回表查询,提高查询效率。
  3. 优化查询语句

    • 减少使用SELECT *,只选择需要的列,以减少数据传输量。
    • 避免在索引列上使用函数,除非函数被索引覆盖。
    • 使用EXISTSIN子句替换JOIN,根据具体情况选择更优的写法。
    • 优化GROUP BYDISTINCT,避免在大数据量上使用,考虑使用物化视图或汇总表。
  4. 避免全表扫描

    • 尽量使用限制条件来减少扫描范围,如WHERE子句。
    • 使用分区表来分割大数据集,减少单个查询的扫描范围。
  5. 数据类型和存储

    • 选择适当的数据类型,避免数据类型过大导致的存储浪费和性能损耗。
    • 考虑使用压缩和归档策略来管理历史数据。
  6. 并发和锁定

    • 优化事务处理,减少锁的等待时间,使用乐观锁或悲观锁策略根据场景选择。
    • 减少长时间运行的查询,避免阻塞其他事务。
  7. 统计信息和维护

    • 定期更新统计信息,确保数据库优化器能够做出准确的决策。
    • 执行定期的索引维护,如重建和重组,保持索引健康。
  8. 使用物化视图和汇总表

    • 对于频繁的复杂查询,可以创建物化视图或汇总表,提前计算结果,减少实时计算的开销。
  9. 数据库配置和硬件

    • 调整数据库配置参数,如缓存大小、并发连接数等,以适应应用需求。
    • 升级硬件,如增加内存、使用更快的存储设备,可以显著提升性能。
  10. 持续监控和调优

    • 使用数据库的监控工具,如慢查询日志、性能监视器等,持续监控数据库性能。
    • 根据监控数据,定期调整和优化SQL查询和索引策略。

SQL优化是一个持续的过程,需要结合应用的具体需求和数据库的特性,不断调整和优化。在实践中,应注重理论与实践相结合,通过测试和实验来验证优化效果。

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

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

相关文章

从0到1制作单只鳌虾运动轨迹追踪软件

前言 需要准备windows10操作系统&#xff0c;python3.11.9&#xff0c;cuDNN8.9.2.26&#xff0c;CUDA11.8&#xff0c;paddleDetection2.7 流程&#xff1a; 准备数据集-澳洲鳌虾VOC数据集 基于RT-DETR目标检测模型训练导出onnx模型进行python部署平滑滤波处理视频帧保留的…

简介时间复杂度

好了&#xff0c;今天我们来了解一下&#xff0c;我们在做练习题中常出现的一个名词。时间复杂度。我相信大家如果有在练习过题目的话。对这个名词应该都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前练习的时候就是这样。我只知道有这么一个名词在题…

【全面讲解下iPhone新机官网验机流程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

MybatisPlus实现插入/修改数据自动设置时间

引言 插入数据时自动设置当前时间&#xff0c;更新数据时自动修改日期为修改时的日期。 使用MybatisPlus的扩展接口MetaObjectHandler 步骤 实现接口 实体类加注解 实现接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

C++ 模版进阶

目录 前言 1. 非类型模版参数 1.1 概念与讲解 1.2 array容器 2. 模版的特化 2.1 概念 2.2 函数模版特化 2.3 类模版特化 2.3.1 全特化 2.3.2 偏特化 3.模版的编译分离 3.1 什么是分离编译 3.2 模版的分离编译 3.3 解决方法 4. 模版总结 总结 前言 本篇文章主要…

包/final/权限修饰符/代码块

包package 1、包的作用 包用来管理不同的类。 2、包名 包名要全部小写&#xff0c;一般是域名反写&#xff0c;如com.liu。在Java中&#xff0c;java解释器会将package中的.解释为目录分隔符/&#xff0c;也就是说该文件的目录结构为&#xff1a;...com/liu/... 3、全类名…

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度 能看懂就行&#xff0c;绝大多数情况不需要真正的编程(shellcode题除外) 其实有时候也不需要读汇编&#xff0c;ida F5 通常都是分析gadget&#xff0c;知道怎么用&#xff0c; 调试程序也不需要分析每一条汇编指令&#xff0c;单步执行然后查看寄存器状态即可 但…

Text2SQL提问中包括时间的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

实现多数相加,但是传的参不固定

一、情景 一般实现的加法和减法等简单的相加减函数的话。一般都是写好固定传的参数。比如&#xff1a; function add(a,b) {return a b;} 这是固定的传入俩个&#xff0c;如果是三个呢&#xff0c;有人说当然好办&#xff01; 这样写不就行了&#xff01; function add(a…

vue中自定义设置多语言(包括使用vue-i18n),并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时&#xff0c;可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件&#xff0c;命名为&#xff1a;language.js&#xff0c;代码如下 // language.js 文档 let languagePage {CN…

聊一下Maven打包的问题(jar要发布)

文章目录 一、问题和现象二、解决方法&#xff08;1&#xff09;方法一、maven-jar-pluginmaven-dependency-plugin&#xff08;2&#xff09;方法二、maven-assembly-plugin 一、问题和现象 现在的开发一直都是用spring boot&#xff0c;突然有一天&#xff0c;要自己开发一个…

Django之项目开发(二)

目录 一、安装和使用uWSGI 1.1、安装 1.2、配置文件 1.3、启动与停止uwsgi 二、安装nginx 三、Nginx 配置uWSGI 四、Nginx配置静态文件 五、Nginx配置负载均衡 一、安装和使用uWSGI uWSGI 是一个 Web 服务器,可以用来部署 Python Web 应用。它是一个高性能的通用的 We…

味蕾与理解:应对自闭症儿童挑食的策略与理解

在星贝育园自闭症康复学校&#xff0c;我们深知饮食习惯对孩子们的成长至关重要&#xff0c;而自闭症儿童的挑食问题往往比同龄儿童更为突出&#xff0c;给家长和照顾者带来了额外的挑战。今天&#xff0c;作为这里的老师&#xff0c;我想与大家分享一些应对自闭症儿童挑食的策…

(南京观海微电子)——电阻应用及选取

什么是电阻&#xff1f; 电阻是描述导体导电性能的物理量&#xff0c;用R表示。 电阻由导体两端的电压U与通过导体的电流I的比值来定义&#xff0c;即&#xff1a; 所以&#xff0c;当导体两端的电压一定时&#xff0c;电阻愈大&#xff0c;通过的电流就愈小&#xff1b;反之&…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…

[Unity入门01] Unity基本操作

参考的傅老师的教程学了一下Unity的基础操作&#xff1a; [傅老師/Unity教學] Unity3D基礎入門 [華梵大學] 遊戲引擎應用基礎(Unity版本) Class#01 移动&#xff1a;鼠标中键旋转&#xff1a;鼠标右键放大&#xff1a;鼠标滚轮飞行模式&#xff1a;右键WASDQEFocus模式&…

算法设计与分析 实验5 并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、实验内容 &#xff08;一&#xff09;基准算法 &#xff08;二&#xff09;高效算法 五、实验结论 一、实验目的 1. 掌握图的连通性。 2. 掌握并查集的基本原理和应用。 二、问题描述 在图论中&#xff0c;一条边被称…

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录&#xff0c;注册、首页、订餐、购物车&#xff0c;我的。 用户注册后&#xff0c;登陆客户端即可完成订餐、浏览菜谱等功能&#xff0c;点餐&#xff0c;加入购物车&#xff0c;结算&#xff0c;以及删减…

【学习笔记】操作系统--万字长文

计算机操作系统 文章目录 计算机操作系统引言 操作系统基本概念第一章 引论目标和作用操作系统发展历程单道批处理系统多道批处理系统分时系统实时系统 基本特征并发共享虚拟异步性&#xff08;不确定性&#xff09; 操作系统主要功能处理机管理内存管理设备管理文件管理 第二章…

python `queue` 模块提供了同步的、线程安全的队列类

在Python中&#xff0c;queue 模块提供了同步的、线程安全的队列类&#xff0c;这使得在多线程环境下共享数据变得简单。下面是一个使用 queue.Queue 的并发编程示例&#xff0c;其中使用了 threading 模块来创建多个线程&#xff0c;这些线程将向队列中添加元素并从队列中取出…