第6章:数据库进阶与优化_第1页
第6章:数据库进阶与优化_第2页
第6章:数据库进阶与优化_第3页
第6章:数据库进阶与优化_第4页
第6章:数据库进阶与优化_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章:数据库进阶与优化从CRUD到性能之巅CONTENTS01.复杂查询优化02.索引原理与最佳实践03.慢查询分析与诊断04.数据库迁移与版本控制05.读写分离与多库路由06.实战:构建高性能商品列表01复杂查询优化复杂查询的性能瓶颈N+1查询问题ORM先执行1条SQL查询主数据,再为每条主数据执行1条SQL查询关联数据,导致总共执行N+1条SQL,性能极差。子查询效率低下相关子查询会对外部查询的每一行执行一次,相当于嵌套循环,数据量大时性能呈指数级下降。JOIN操作过多多表JOIN增加查询复杂度,尤其在表大且缺乏有效索引时,优化器难以选择最优执行计划。LIMIT深分页问题`LIMIT100000,10`需扫描前100010条记录,大量IO被浪费,偏移量越大性能越差。查询优化策略:避免N+1优化前:N+1查询1条查询用户SQL+N条查询订单SQL,导致大量数据库交互。users=User.query.all()foruserinusers:print(user.orders)#每次迭代触发新查询优化后:使用joinedload1条JOIN查询,一次性获取所有关联数据。users=User.query.options(joinedload(User.orders)).all()foruserinusers:print(user.orders)#不触发新查询另一种选择:subqueryload执行2条SQL(用户+所有订单),在内存中关联。适用于特定场景,性能有时优于JOIN。查询优化策略:LIMIT深分页优化问题分析`LIMITOFFSET`语法需扫描并跳过OFFSET条记录,当OFFSET值非常大时,扫描过程会非常耗时,导致查询性能急剧下降。解决方案1:书签分页原理使用上一页最后一条记录的唯一标识(如ID)作为查询条件,而非偏移量。优点性能极高,查询速度恒定,不受页数影响。缺点不支持跳页,只能顺序浏览。解决方案2:延迟关联原理先通过覆盖索引快速找到主键ID,再与主表关联查询完整数据。代码示例SELECTu.*FROMusersuJOIN(SELECTidFROMusersORDERBYidLIMIT100000,10)tONu.id=t.id;优点性能提升显著,兼容性好,完美支持跳页功能。02索引原理与最佳实践索引基础:B+树索引平衡多路查找树所有叶子节点在同一层,保证查询时间复杂度稳定为O(logn)。有序性叶子节点有序排列并通过双向链表连接,适合范围查询和排序。非叶子节点仅存索引树高通常3-4层,极大减少磁盘IO操作次数,提升查询效率。高效查询过程从根节点开始逐层向下,最终在叶子节点找到目标数据。B+树结构示意图索引类型与选择索引类型适用场景优点缺点B+树索引全值匹配、范围查询、排序、分组功能全面,查询稳定,是数据库的主力索引空间开销相对较大哈希索引等值查询(=,IN)查询速度理论上是O(1),非常快不支持范围查询、排序和模糊查询GIN索引数组、JSON、Hstore、全文搜索支持复杂数据类型的成员查询和全文检索写入性能较低,空间开销大GiST索引地理信息、范围类型、自定义数据类型支持空间数据和自定义数据类型的复杂查询查询性能相对B+树较低,维护成本高索引设计的“黄金法则”最左前缀匹配原则索引生效顺序严格按定义顺序,是联合索引的核心。如(a,b,c)支持a,a&b,a&b&c,但不支持b&c。选择高选择性的列作为索引选择性越高(值越唯一),过滤效果越好,查询效率越高。如身份证号远优于性别。避免过度索引索引加速查询但减慢写入(INSERT/UPDATE/DELETE),需根据读写比例权衡。利用覆盖索引查询所需字段均在索引中,无需回表,是最高效的查询方式之一。03慢查询分析与诊断开启慢查询日志MySQL配置开启慢查询日志

slow_query_log=ON指定日志文件路径

slow_query_log_file=/var/log/mysql/slow.log定义“慢查询”阈值(秒)

long_query_time=2记录未使用索引的查询

log_queries_not_using_indexes=ONPostgreSQL配置定义“慢查询”阈值(毫秒)

log_min_duration_statement=2000记录所有语句(调试用)

log_statement='all'仅记录DDL语句

log_statement='ddl'记录修改数据的语句

log_statement='mod'临时生效(重启后失效)

SETGLOBALslow_query_log='ON';永久生效(需重启服务)

修改配置文件f/postgresql.conf分析慢查询日志常用分析工具mysqldumpslow(MySQL)MySQL自带工具,可按频率、耗时等维度汇总慢查询。mysqldumpslow-sc-t10slow.logpt-query-digest(Percona)功能强大的第三方工具,生成详细分析报告,为MySQL首选。pgBadger(PostgreSQL)快速日志分析器,生成美观的HTML格式可视化报告。关键分析维度查询频率识别执行最频繁的SQL语句。平均/最大耗时定位单次执行时间最长的SQL。锁定时间分析SQL等待锁的时间,发现并发瓶颈。扫描vs返回行数评估查询效率,判断是否缺少索引。使用EXPLAIN分析执行计划什么是执行计划?数据库优化器对SQL的执行方案,展示了查询将如何执行,包括索引使用、表连接方式、数据扫描行数等。案例分析通过分析慢查询的EXPLAIN结果,识别问题并给出优化方案。问题识别type:ALL,Usingfilesort优化方案添加合适的联合索引关键字段解读type:联接类型const>eq_ref>ref>range>index>ALLkey:实际使用的索引为NULL表示未使用索引。rows:预估扫描行数数值越小,查询效率越高。Extra:额外信息警惕Usingtemporary和Usingfilesort。04数据库迁移与版本控制数据库迁移工具:AlembicAlembic简介SQLAlchemy作者开发的数据库迁移工具,是Python项目中数据库版本控制的事实标准。核心概念迁移脚本(MigrationScript)包含`upgrade()`和`downgrade()`函数,定义结构变更与回滚逻辑。版本号(Version)每个脚本的唯一标识,用于记录和追踪迁移的先后顺序。基本工作流1.初始化项目alembicinitalembic2.配置数据库连接编辑alembic.ini文件3.生成并编辑脚本alembicrevision--autogenerate4.执行升级/降级alembicupgradehead/downgrade-105读写分离与多库路由读写分离架构核心思想主库(Master)处理写操作,从库(Slave)处理读操作,通过主从复制同步数据,分散读压力。实现方式应用层方案:代码手动路由,灵活但侵入性强。中间件方案:对应用透明,但增加系统复杂度。数据一致性挑战主从延迟:从库可能读取到旧数据。解决方案:强制读主、半同步复制、业务妥协。架构示意图主库写入,从库读取,通过复制机制同步数据总结与课后任务内容总结查询优化避免N+1查询、优化深分页(书签/延迟关联)。索引设计理解B+树原理,掌握联合索引最左前缀原则。性能诊断使用慢查询日志与EXPLAIN分析SQL性能瓶颈。架构扩展学习Alembic迁移与读写分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论