37、aiomysql实操习题
练习题1:慢查询优化
题目描述
将以下低效查询优化为索引查询:
# 原始低效查询
await cursor.execute("SELECT * FROM orders WHERE YEAR(created_at)=2023")
参考答案
# 优化后查询(使用索引范围扫描)
await cursor.execute("SELECT * FROM orders WHERE created_at >= %s AND created_at < %s",('2023-01-01 00:00:00', '2024-01-01 00:00:00')
)
优化原理:
- 避免在列上使用函数(YEAR()),防止索引失效
- 使用
created_at
字段的索引进行范围扫描 - 提前创建索引:
ALTER TABLE orders ADD INDEX idx_created_at (created_at);
练习题2:死锁复现与解决
题目描述
编写两个并发事务,模拟资金转账场景下的死锁,并实现自动重试机制
参考答案
async def transfer_with_retry(pool, from_id, to_id, amount):async def _execute_transfer():async with pool.acquire() as conn:await conn.begin()try:async with conn.cursor() as cursor:# 故意制造死锁顺序if from_id < to_id:await cursor.execute("SELECT * FROM accounts WHERE user_id=%s FOR UPDATE", (from_id))await cursor.execute("SELECT * FROM accounts WHERE user_id=%s FOR UPDATE", (to_id))else:await cursor.execute("SELECT * FROM accounts WHERE user_id=%s FOR UPDATE", (to_id))await cursor.execute("SELECT * FROM accounts WHERE user_id=%s FOR UPDATE", (from_id))# 实际转账操作await cursor.execute("UPDATE accounts SET balance=balance-%s WHERE user_id=%s", (amount, from_id))await cursor.execute("UPDATE accounts SET balance=balance+%s WHERE user_id=%s", (amount, to_id))await conn.commit()except Exception as e:await conn.rollback()raise# 死锁自动重试 return await retry_on_deadlock(_execute_transfer, max_retries=3)# 测试死锁(并发执行相反顺序转账)
async def test_deadlock():pool = await create_pool()task1 = transfer_with_retry(pool, 1, 2, 100)task2 = transfer_with_retry(pool, 2, 1, 50)await asyncio.gather(task1, task2)
关键机制:
- 通过
FOR UPDATE
显式加锁 - 使用不同的锁顺序触发死锁
- 重试装饰器捕获错误码1213(死锁)
练习题3:连接泄漏检测
题目描述
找出以下代码中的连接泄漏问题并修复:
async def leaky_function(pool):conn = await pool.acquire()cursor = await conn.cursor()await cursor.execute("SELECT * FROM users")result = await cursor.fetchall()await cursor.close()return result
参考答案
async def fixed_function(pool):async with pool.acquire() as conn: # 自动释放连接async with conn.cursor() as cursor: # 自动关闭游标await cursor.execute("SELECT * FROM users")return await cursor.fetchall()
修复要点:
-
使用
async with
上下文管理器确保连接释放 -
完整连接生命周期管理:
-
监控代码示例:
async def check_leaks(pool):print(f"使用中的连接: {pool.size - pool.freesize}")if pool.size > pool.maxsize * 0.8:print("警告: 连接池使用率超过80%!")
练习题4:分页查询优化
题目描述
将传统分页改为游标分页:
# 原始分页
await cursor.execute("SELECT * FROM orders ORDER BY id LIMIT 10 OFFSET 20"
)
参考答案
# 优化分页(基于游标)
last_id = 100 # 上一页最后记录的ID
await cursor.execute("SELECT * FROM orders WHERE id > %s ORDER BY id LIMIT 10",(last_id,)
)
优势分析:
- 避免
OFFSET
带来的全表扫描 - 分页效率从O(N)降至O(1)
- 适合无限滚动加载场景
练习题5:批量更新优化
题目描述
将循环单条更新改为批量操作:
# 低效写法
for order in orders:await cursor.execute("UPDATE orders SET status=%s WHERE id=%s",(new_status, order['id']))
参考答案
# 高效批量更新
update_data = [(o['status'], o['id']) for o in orders]
await cursor.executemany("UPDATE orders SET status=%s WHERE id=%s",update_data
)
await conn.commit()
性能对比:
数据量 | 单条提交耗时 | 批量提交耗时 |
---|---|---|
1000条 | 4.2s | 0.8s |
5000条 | 21.5s | 3.1s |
综合挑战:订单系统完整实现
class AsyncOrderSystem:def __init__(self, pool):self.pool = poolasync def create_order(self, user_id, items):async with self.pool.acquire() as conn:await conn.begin()try:async with conn.cursor() as cursor:# 创建订单await cursor.execute("INSERT INTO orders (user_id, status) VALUES (%s, 'pending')",(user_id,))order_id = cursor.lastrowid# 插入订单明细await cursor.executemany("INSERT INTO order_items (order_id, product_id, quantity) VALUES (%s, %s, %s)",[(order_id, item['id'], item['qty']) for item in items])# 扣减库存await cursor.executemany("UPDATE products SET stock=stock-%s WHERE id=%s AND stock >= %s",[(item['qty'], item['id'], item['qty']) for item in items])await conn.commit()return order_idexcept Exception as e:await conn.rollback()raise
实现要点:
- 使用事务保证订单创建的原子性
- 批量操作提升性能
- 库存检查前置避免超卖
以上练习题覆盖了异步数据库操作的核心难点,建议在开发环境中实际运行并观察效果。可通过以下方式验证结果:
# 性能测试
async def test_performance():pool = await create_pool()# 执行10次查询取平均值start = time.perf_counter()for _ in range(10):await fixed_function(pool)print(f"平均耗时: {(time.perf_counter()-start)/10:.4f}s")# 死锁检测
async def test_deadlock_detection():with pytest.raises(ValueError) as excinfo:await test_deadlock()assert "deadlock" in str(excinfo.value).lower()
相关文章:
37、aiomysql实操习题
练习题1:慢查询优化 题目描述 将以下低效查询优化为索引查询: # 原始低效查询 await cursor.execute("SELECT * FROM orders WHERE YEAR(created_at)2023")参考答案 # 优化后查询(使用索引范围扫描) await cursor.e…...
Rust 2025:内存安全革命与异步编程新纪元
Rust 2025 Edition通过区域内存管理、泛型关联类型和零成本异步框架三大革新,重新定义系统级编程语言的能力边界。本次升级不仅将内存安全验证效率提升80%,更通过异步执行器架构优化实现微秒级任务切换。本文从编译器原理、运行时机制、编程范式转型三个…...

【安装neo4j-5.26.5社区版 完整过程】
1. 安装java 下载 JDK21-windows官网地址 配置环境变量 在底下的系统变量中新建系统变量,变量名为JAVA_HOME21,变量值为JDK文件夹路径,默认为: C:\Program Files\Java\jdk-21然后在用户变量的Path中,添加下面两个&am…...
开关电源实战(六)STM32数控电源BuckBoost
文章目录 芯片手册详解栅极驱动器EG3112栅极驱动芯片2EDF7275K隔离式MOS栅极驱动器运放检测电流GS8558MCP6022打板测试硬件设计PID测试存在的问题参考:基于STM32的同步整流Buck-Boost数字电源 开源 芯片手册详解 栅极驱动器 EG3112栅极驱动芯片 (较低芯片,一个四五毛) …...
Vue3项目中 npm 依赖安装 --save 与 --save-dev 的区别解析
这两个命令的区别如下: bash npm install --save types/crypto-js # 安装到 dependencies(生产依赖) npm install --save-dev types/crypto-js # 安装到 devDependencies(开发依赖) 核心区别 依赖分类不同…...
Oracle 数据库中的 JSON:性能注意事项
本文为白皮书“JSON in Oracle Database: Performance Considerations”的翻译及阅读笔记。 目的 本文档概述了在 Oracle 数据库中存储和处理的 JavaScript 对象表示法 (JSON) 的性能调优最佳实践。应用这些最佳实践将使开发人员、数据库管理员和架构师能够主动避免性能问题&…...

机器人项目管理新风口:如何高效推动智能机器人研发?
在2025年政府工作报告中,“智能机器人”首次被正式纳入国家发展战略关键词。从蛇年春晚的秧歌舞机器人惊艳亮相,到全球首个人形机器人马拉松的热议,智能机器人不仅成为科技前沿的焦点,也为产业升级注入了新动能。而在热潮背后&…...

【Linux】网络基础和socket(4)
1.网络通信(app\浏览器、小程序) 2.网络通信三要素: IP:计算机在网络上唯一标识(ipv4:4个字段,每段最大255 IPV6:16进制) 端口:计算机应用或服务唯一标识 ssh提供远程安全连接…...

大数据可能出现的bug之flume
一、vi /software/flume/conf/dir_to_logger.conf配置文件 问题的关键: Dir的D写成了小写 另一个终端里面的东西一直在监听状态下无法显示 原来是vi /software/flume/conf/dir_to_logger.conf里面的配置文件写错了 所以说不是没有source参数的第三行的原因 跟这个没关系 …...

图解Mysql原理之全局锁,表级锁,行锁了解吗?
前言 大家好,我是程序蛇玩编程。 Mysql中的锁大家都用过吗,那全局锁,表锁,行锁哪个用的频率最多呢? 正文 全局锁: 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables wi…...
JavaScript 的“世界模型”:深入理解对象 (Objects)
引言:超越简单值,构建复杂实体 到目前为止,我们学习的变量大多存储的是单一的值,比如一个数字 (let age 30;)、一个字符串 (let name "Alice";) 或一个布尔值 (let isActive true;)。这对于简单场景足够了&am…...

Java集成【邮箱验证找回密码】功能
目录 1.添加依赖 2.选择一个自己的邮箱,作为发件人角色。 3.编写邮箱配置【配置发件人邮箱】 4.编写邮箱配置类 5.编写controller业务代码 6.演示效果 7.总结流程 8.注意 结语 一.发送邮箱验证码 1.添加依赖 <!--导入邮箱依赖--> <dependency&g…...

HarmonyOS 5.0应用开发——MVVM模式的应用
【高心星出品】 文章目录 MVVM模式的应用ArkUI开发模式图架构设计原则案例运行效果项目结构功能特性开发环境model层viewmodel层view层 MVVM模式的应用 MVVM(Model-View-ViewModel)模式是一种广泛用于应用开发的架构模式,它有助于分离应用程…...

程序员鱼皮最新项目-----AI超级智能体教程(一)
文章目录 1.前言1.什么是AI大模型2.什么是多模态3.阿里云百炼平台介绍3.1文本调试展示3.2阿里云和dashscope的关系3.3平台智能体应用3.4工作流的创建3.5智能体编排应用 1.前言 最近鱼皮大佬出了一套关于这个AI 的教程,关注鱼皮大佬很久了,鱼皮大佬确实在…...

【AI模型学习】双流网络——更强大的网络设计
文章目录 一 背景1.1 背景1.2 研究目标 二 模型2.1 双流架构2.2 光流 三 实验四 思考4.1 多流架构4.2 fusion策略4.3 fusion的early与late 先简单聊了双流网络最初在视频中的起源,之后把重点放在 “多流结构"和"fusion” 上。 一 背景 1.1 背景 Two-Str…...

HarmonyOS:一多能力介绍:一次开发,多端部署
概述 如果一个应用需要在多个设备上提供同样的内容,则需要适配不同的屏幕尺寸和硬件,开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发,多端部署”(后文中简称为“一多”)的能力,可以基于一种设计…...

“在中国,为中国” 英飞凌汽车业务正式发布中国本土化战略
3月28日,以“夯实电动化,推进智能化,实现高质量发展”为主题的2025中国电动汽车百人会论坛在北京举办。众多中外机构与行业上下游嘉宾就全球及中国汽车电动化的发展现状、面临的挑战与机遇,以及在技术创新、市场布局、供应链协同等…...
《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇 📖 教程目录 为什么选择 Pinia?1.1 背景介绍1.2 Vuex 的痛点(对…...

Java技术体系的主要产品线详解
Java技术体系的主要产品线详解 Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。 Java ME(Micro Edition):支持Java程序运行在移动终端(手机、P…...

机器学习快速入门--0算力起步实践篇
在学习人工智能的过程中,显卡是必不可少的工具,但它的成本较高且更新换代速度很快。那么,没有GPU的情况下如何学习人工智能呢?以下是针对普通电脑与有算力环境分离的学习规划方案,尤其适合前期无GPU/云计算资源的学习者…...
MySQL 详解之索引:提升查询效率的秘密武器
在数据库的世界里,数据量通常是巨大的。想象一下,一个拥有数百万甚至数十亿条记录的表格,如果你需要从中查找符合特定条件的几条甚至一条记录,数据库是如何快速找到它们的呢?如果没有高效的机制,数据库不得不一条条地遍历整个表格,这无疑会非常缓慢和耗费资源。这时,索…...
中通 Redis 集群从 VM 迁移至 PVE:技术差异、PVE 优劣势及应用场景深度解析
在数字化转型浪潮下,企业对服务器资源的高效利用与成本控制愈发重视。近期,中通快递将服务器上的 Redis 集群服务从 VM(VMware 虚拟化技术)迁移至 PVE(Proxmox VE),这一技术举措引发了行业广泛关…...

源码篇 剖析 Vue2 双向绑定原理
前置操作 源码代码仓地址:https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击,复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…...
Restful接口学习
一、为什么RESTful接口是数据开发的核心枢纽? 在数据驱动的时代,RESTful接口如同数据高速公路上的收费站,承担着数据交换的核心职责。数据工程师每天需要面对: 异构系统间的数据交互(Hadoop集群 ↔ 业务系统…...
C++ round 函数笔记 (适用于算法竞赛)
在算法竞赛中,处理浮点数并将其转换为整数是常见的需求,round 函数是标准库提供的用于执行“四舍五入”到最近整数的工具。理解其工作方式和潜在问题对于避免错误至关重要。 1. 基本用法 头文件 要使用 round 函数,需要包含 <cmath>…...
1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术(架构模式/性能优化) 业务(模型抽象→技术方案) 管理(团队协作/风险控制) 知识体系 基础:CAP/设计模式/网络协议案例&am…...

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
前言 今天我们就来讲讲什么是单例模式与线程池的相关知识,这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢?上面说到的设计模式又是什么? 其实单例模式就是设计模式的一种。…...
JAVA程序获取SVN提交记录
1.获取文件提交记录 private String userName "userName "; //svn账号 private String password "password "; //svn密码 private String urlString "urlString "; //svnurl 换成自己对应的svn信息 package com.tengzhi.common.dao;import…...

STM32配置系统时钟
1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟,后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗,一开始是关闭了所有的外设的时钟,所以外设想要工作,首先就要打开时钟,所以后面…...

React 与 Vue:两大前端框架的深度对比
在前端开发领域,React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点,吸引了大量开发者。无论是初学者还是经验丰富的工程师,选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…...