ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

军队文职考试——第14期:数据量超过10万条,怎么优化查询语句?交换机连接电脑,用的网线是哪类接线?递归算法你是怎么理解的

军队文职考试——第14期:数据量超过10万条,怎么优化查询语句?交换机连接电脑,用的网线是哪类接线?递归算法你是怎么理解的 目录1.1 递归算法你是怎么理解的1.1.1 附阶乘计算1.1.2 斐波那契数列1.1.3 数组求和1.1.4 计算幂1.1.5 递归实现二分查找1.2 确定软件需求的步骤有哪些1.3 面向对象语言的三大特征是什么1.4 数据量超过 10 万条怎么优化查询语句1.4.1 创建索引1.4.2 使用 LIMIT 进行分页查询1.4.3 范围查询优化1.4.4 缓存查询结果1.5 交换机连接电脑用的网线是哪类接线1.6 (半) 开放类题目建设计算机系统时对软件和硬件需要做哪些规划1.1 递归算法你是怎么理解的递归Recursion是一种函数直接或间接调用自身的编程技巧。理解递归需要抓住两个核心基准情形Base Case递归的终止条件防止无限调用。递归步骤Recursive Step将原问题分解为规模更小的同类问题并逐步向基准情形靠近。递归的本质是“用栈保存现场”每次调用都会在调用栈中压入一层直到基准情形返回后再逐层回溯。递归代码通常简洁、可读性强但要注意栈溢出和重复计算问题。实例1.1.1 附阶乘计算阶乘定义n! n × (n-1) × ... × 1且0! 1。def factorial(n): if n 0: # 基准情形 return 1 return n * factorial(n - 1) # 递归步骤 print(factorial(5)) # 输出 1201.1.2 斐波那契数列斐波那契数列F(0)0, F(1)1, F(n)F(n-1)F(n-2)。def fib(n): if n 0: return 0 if n 1: return 1 return fib(n - 1) fib(n - 2) print(fib(6)) # 输出 8注意朴素递归存在大量重复计算可用记忆化Memoization或动态规划优化。1.1.3 数组求和递归思路数组前n个元素之和 第n个元素 前n-1个元素之和。def array_sum(arr, n): if n 0: # 基准情形 return 0 return arr[n - 1] array_sum(arr, n - 1) print(array_sum([1, 2, 3, 4, 5], 5)) # 输出 151.1.4 计算幂计算x^n递归式power(x, n) x * power(x, n-1)基准n0时返回 1。def power(x, n): if n 0: return 1 return x * power(x, n - 1) print(power(2, 10)) # 输出 1024优化快速幂可将时间复杂度从 O(n) 降至 O(log n)。1.1.5 递归实现二分查找二分查找要求数组有序。每次比较中间元素若相等则返回若目标较小递归左半部分否则递归右半部分。def binary_search(arr, target, low, high): if low high: # 基准情形未找到 return -1 mid (low high) // 2 if arr[mid] target: return mid elif arr[mid] target: return binary_search(arr, target, low, mid - 1) else: return binary_search(arr, target, mid 1, high) arr [1, 3, 5, 7, 9, 11] print(binary_search(arr, 7, 0, len(arr) - 1)) # 输出 3追问 1递归和迭代如何选择答递归代码简洁、适合树/图等天然递归结构迭代效率高、无栈溢出风险。深度大时优先迭代。追问 2如何优化斐波那契递归答记忆化缓存已算值或动态规划将 O(2^n) 降为 O(n)。追问 3尾递归是什么Python 支持吗答尾递归是递归调用位于函数最后一步可复用栈帧。Python 默认不支持尾递归优化仍可能栈溢出。各递归实例的复杂度分析下面汇总本节各递归实例的时间复杂度和空间复杂度便于对比记忆递归实例时间复杂度空间复杂度说明阶乘计算O(n)O(n)递归深度为 n调用栈占用 O(n) 空间。斐波那契数列朴素递归O(2^n)O(n)存在大量重复子问题调用树呈指数级膨胀。斐波那契数列记忆化O(n)O(n)每个子问题只计算一次缓存数组占用 O(n) 空间。数组求和O(n)O(n)递归深度为 n逐层累加。计算幂朴素递归O(n)O(n)每次只减少 1 个指数递归深度为 n。计算幂快速幂O(log n)O(log n)每次将指数减半递归深度为 log n。二分查找O(log n)O(log n)每次将搜索区间减半递归深度为 log n。为什么朴素斐波那契递归是指数级复杂度以fib(n)为例计算它需要分别递归调用fib(n-1)和fib(n-2)而这两个子问题又各自继续分裂。设调用次数为 T(n)则满足递推式T(n) T(n-1) T(n-2) 1 T(0) T(1) 1该递推式的解约为T(n) O(2^n)。直观上看递归调用树是一棵近似满二叉树树高为 n节点数随深度呈指数增长。更关键的是大量子问题被重复计算例如fib(4)会被fib(5)、fib(6)等多个上层调用反复求解造成严重的计算浪费。记忆化优化后的复杂度变化记忆化Memoization的核心思路是用一个缓存如字典或数组记录已经计算过的fib(k)结果下次再遇到时直接返回不再重复递归。这样每个k从 0 到 n 最多只计算一次因此时间复杂度从O(2^n)降为O(n)。空间复杂度为O(n)用于存储缓存结果同时递归调用栈深度仍为 O(n)。若进一步改用自底向上的动态规划迭代填表时间复杂度同样为 O(n)且可把空间复杂度优化到 O(1)只保留前两个值。1.2 确定软件需求的步骤有哪些确定软件需求通常遵循以下步骤需求获取与客户、用户、领域专家沟通通过访谈、问卷、观察、原型等方式收集原始需求。需求分析对获取的信息进行分类、提炼、建模识别功能需求、非功能需求、约束条件解决冲突。需求规格说明编写《软件需求规格说明书》SRS明确描述系统应具备的功能、性能、接口、数据等。需求验证通过评审、原型演示、测试用例等方式确认需求正确、完整、一致、可验证。需求管理建立需求基线跟踪需求变更确保需求与设计、开发、测试保持一致。追问 1需求获取常用哪些方法答访谈、问卷、头脑风暴、观察、原型、文档分析、联合应用开发JAD。追问 2功能需求和非功能需求区别答功能需求描述“做什么”如登录非功能需求描述“做得怎样”如性能、安全、可用性。追问 3需求变更如何管理答建立变更控制流程评估影响、审批、更新基线并同步到设计、代码和测试。1.3 面向对象语言的三大特征是什么面向对象编程OOP的三大特征封装Encapsulation将数据和行为包装在类中隐藏内部实现细节仅通过公开接口访问提高安全性和可维护性。继承Inheritance子类可以复用父类的属性和方法并在此基础上扩展或重写实现代码复用和层次化设计。多态Polymorphism同一接口在不同对象上有不同实现。例如父类引用指向子类对象调用同一方法产生不同行为重写、重载。追问 1封装有什么好处答提高安全性、可维护性降低耦合便于修改内部实现而不影响外部调用。追问 2继承和多态的关系答继承是多态的基础之一子类重写父类方法运行时根据实际对象类型调用对应实现。追问 3多态有哪几种实现方式答重写运行时多态、重载编译时多态、接口实现、抽象类。1.4 数据量超过 10 万条怎么优化查询语句当单表数据超过 10 万条时查询性能可能明显下降。常见优化手段包括建立合适索引、分页查询、范围查询优化、结果缓存等。优化查询语句实例1.4.1 创建索引在WHERE、JOIN、ORDER BY、GROUP BY涉及的列上创建索引。使用复合索引时遵循最左前缀原则。避免索引过多因为索引会降低写入速度并占用存储。在使用最频繁、区分度最大的字段上创建索引并最左。-- 为经常查询的 user_id 和 create_time 创建复合索引 CREATE INDEX idx_user_time ON orders(user_id, create_time);1.4.2 使用 LIMIT 进行分页查询避免大偏移量LIMIT 100000, 10因为数据库仍需扫描前 100000 行。推荐使用“游标分页”或“基于主键/索引的范围查询”。-- 不推荐 SELECT * FROM orders ORDER BY id LIMIT 100000, 10; -- 推荐记住上一页最后一条的 id SELECT * FROM orders WHERE id 100000 ORDER BY id LIMIT 10;1.4.3 范围查询优化避免在索引列上使用函数或表达式否则索引失效。使用BETWEEN、、等直接比较。注意OR条件可能降低索引效率可改写为UNION ALL。sql-- 不推荐索引列使用函数 SELECT * FROM orders WHERE YEAR(create_time) 2024; -- 推荐范围查询 SELECT * FROM orders WHERE create_time 2024-01-01 AND create_time 2025-01-01;1.4.4 缓存查询结果使用 Redis、Memcached 等缓存热点查询结果减少数据库压力。对实时性要求不高的数据可设置合理过期时间。注意缓存与数据库的一致性可采用“先更新数据库再删除缓存”等策略。python# 伪代码先查缓存未命中再查数据库并回写 data redis.get(orders:user:123) if not data: data db.query(SELECT * FROM orders WHERE user_id 123) redis.setex(orders:user:123, 300, data)四种优化手段对比优化手段适用场景优点缺点注意事项创建索引查询条件、排序、分组涉及的列数据区分度高、读多写少的表大幅提升查询速度减少全表扫描占用存储空间降低写入性能遵循最左前缀原则避免索引列使用函数或隐式类型转换索引不宜过多LIMIT 分页列表页、后台管理等需要分页展示数据的场景实现简单控制单次返回数据量大偏移量时仍需扫描大量行越往后越慢避免LIMIT 100000, 10大偏移推荐游标分页或基于主键/索引范围查询范围查询优化按时间、数值等区间过滤数据的查询可充分利用索引查询高效对写法要求较高写法不当易导致索引失效使用BETWEEN、、直接比较OR可改写为UNION ALL缓存查询结果热点数据、实时性要求不高、读多写少的查询显著降低数据库压力响应更快存在缓存与数据库一致性问题占用额外内存设置合理过期时间采用“先更新数据库再删除缓存”等一致性策略追问 1索引失效的常见场景答索引列用函数、隐式类型转换、LIKE %abc、OR部分无索引、不满足最左前缀、!、NOT IN、IS NULL等。追问 2分页查询越往后越慢怎么办答用游标分页记录上一页最后 id或基于索引范围查询避免大偏移量。追问 3缓存与数据库如何保持一致答常用“先更新数据库再删除缓存”或延迟双删、订阅 binlog 异步更新。1.5 交换机连接电脑用的网线是哪类接线传统网络规范中交换机普通端口 ↔ 电脑网卡使用直通线两端同为 T568A 或同为 T568B。交换机普通端口 ↔ 交换机普通端口使用交叉线一端 T568A另一端 T568B。交换机 Uplink 口 ↔ 交换机普通口使用直通线。现代交换机普遍支持Auto MDI/MDIX自动翻转功能因此无论直通线还是交叉线都可以正常通信。实际工程中交换机连接电脑通常直接使用直通线T568B 线序即可。追问 1T568A 和 T568B 线序区别答T568A 绿白绿橙白蓝蓝白橙棕白棕T568B 橙白橙绿白蓝蓝白绿棕白棕。主要区别是橙绿线对调。追问 2什么情况下必须用交叉线答老旧设备不支持 Auto MDI/MDIX 时同种设备如交换机-交换机、电脑-电脑互连需交叉线。追问 3千兆网络对网线有什么要求答千兆需超五类Cat5e或六类Cat6及以上八芯全接长度不超过 100 米。1.6 (半) 开放类题目建设计算机系统时对软件和硬件需要做哪些规划建设计算机系统时软硬件规划需从需求出发兼顾性能、成本、可扩展性和安全性。硬件规划需求分析明确用途服务器、开发、办公、科研等、并发量、数据量、性能指标。预算评估确定总预算及分配比例。硬件选型CPU核心数、主频、架构Intel/AMD/ARM。内存容量、频率、是否支持 ECC。存储SSD/HDD、容量、RAID 方案。网络网卡速率、交换机、路由器。电源、机箱、散热等。可扩展性预留插槽、盘位、内存槽便于未来升级。冗余与可靠性电源冗余、磁盘 RAID、备份策略。软件规划操作系统Windows、Linux 发行版、Unix 等根据应用兼容性选择。数据库MySQL、PostgreSQL、Oracle、SQL Server 等考虑数据量、并发、事务要求。中间件Web 服务器Nginx/Apache、应用服务器Tomcat、消息队列等。应用软件开发工具、办公软件、行业专用软件。安全软件防火墙、杀毒、入侵检测、权限管理。备份与恢复定期备份策略、灾难恢复预案。许可与合规软件授权、开源协议、数据隐私法规。综合规划软硬件兼容性测试。系统集成与部署方案。运维监控与技术支持。成本效益分析与长期演进路线。追问 1如何确定硬件配置答根据用途、并发量、数据量、性能指标和预算参考基准测试预留 20%-30% 余量。追问 2高可用和容灾如何规划答硬件冗余、集群负载均衡、主从复制、异地备份、制定 RTO/RPO定期演练。追问 3软件选型考虑哪些因素答功能匹配、性能、兼容性、成本、社区支持、安全性、可维护性、许可协议。软硬件规划清单可勾选以下清单覆盖硬件选型、软件选型、安全、备份等关键项可直接复制使用逐项勾选确认明确系统用途服务器、开发、办公、科研等与并发量、数据量、性能指标。确定总预算及软硬件分配比例。硬件选型CPU 核心数、主频、架构Intel/AMD/ARM。硬件选型内存容量、频率、是否支持 ECC。硬件选型存储 SSD/HDD、容量、RAID 方案。硬件选型网卡速率、交换机、路由器等网络设备。硬件选型电源、机箱、散热等配套设施。预留插槽、盘位、内存槽保证可扩展性。规划电源冗余、磁盘 RAID、备份策略等冗余与可靠性措施。软件选型操作系统Windows、Linux 发行版、Unix 等与应用兼容性。软件选型数据库MySQL、PostgreSQL、Oracle、SQL Server 等与数据量、并发、事务要求匹配。软件选型中间件Web 服务器、应用服务器、消息队列等。软件选型开发工具、办公软件、行业专用软件。安全规划部署防火墙、杀毒、入侵检测、权限管理。备份与恢复制定定期备份策略与灾难恢复预案。许可与合规确认软件授权、开源协议、数据隐私法规。进行软硬件兼容性测试。制定系统集成与部署方案。规划运维监控与技术支持。完成成本效益分析与长期演进路线。软硬件规划流程Mermaid 流程图下面用 Mermaid 流程图展示从需求分析、预算评估、硬件选型、软件选型到部署运维的完整规划流程flowchart TD A[需求分析] -- B[预算评估] B -- C[硬件选型] B -- D[软件选型] C -- E[可扩展性与冗余规划] D -- F[安全与合规规划] E -- G[软硬件兼容性测试] F -- G G -- H[系统集成与部署] H -- I[运维监控与技术支持] I -- J[成本效益分析与长期演进]
返回列表