SQL业务审核与优化
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,转自http://www.cnblogs.com/Aiapple/p/5697229.html审核什么是业务审核类似与code review评审业务Schema和SQL设计偏重关注性能是业务优化的主要
千家信息网最后更新 2024年11月11日SQL业务审核与优化转自http://www.cnblogs.com/Aiapple/p/5697229.html
审核
什么是业务审核
查询优化,索引优化,库表结构优化需要齐头并进。 慢查询两个步骤分析:
mysql查询执行路径
一条查询可以有很多种执行方式,最后都返回相同的结果。 优化器的作用就是找到这其中最好的执行计划。 mysql使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。 通过查询当前会话的last_query_cost的值来得知Mysql计算的当前查询的成本。 mysql>selectcount(*) from film_actor; +----------+|count(*) |+----------+|5462|+----------+1 row inset (0.00 sec)
1 关联子查询 mysql的子查询实现得非常糟糕;最糟糕的一类查询是where条件中包含IN()的子查询语句。 例如,我们希望找到sakila数据库中,演员actor_id为1,参演过的所有影片信息。很自然的,我们会按照下面的方式
审核
什么是业务审核
- 类似与code review
- 评审业务Schema和SQL设计
- 偏重关注性能
- 是业务优化的主要入口之一
- 表和字段命名是否合规
- 字段类型,长度设计是否适当
- 表关联关系是否合理
- 主键,更新时间保留字段等是否符合要求
- 约束,默认值等配置是否恰当
- 了解业务,表数据量,增长模式
- 数据访问模式,均衡度
- 根据业务需求,表是否需要分区,是否有数据什么周期
- SQL语句的执行频率
- 表上是否有合适的索引
- 单次执行的成本
- 执行模式,锁情况分析
- 关注事务上下文
- 业务开发阶段,上线前
- 业务版本变更,线上更新前
- 新表和SQL上线
- SQL查询条件变化
- SQL查询频率变化
- 业务逻辑导致现有表数据量规模变化
- SQL审核需要开发与应用运维支持
- 充分沟通,做好必要性说明和教育工作
- 指定业务发布流程,嵌入DBA审核环节
- 积累经验,不断完善评审方法
查询优化,索引优化,库表结构优化需要齐头并进。 慢查询两个步骤分析:
- 确认应用程序是否向数据库请求了大量超过需要的数据
- 确认mysql服务器层是否在处理大量超过需要的数据记录
- 查询不需要的记录
- 多表关联时返回全部列
- 总是取出全部列
- 重复查询相同的数据
- 响应时间
- 扫描的行数
- 返回的行数
- 使用索引覆盖扫描,把所有需要用的列都放到索引中。
- 改变库表结构。例如使用单独的汇总表
- 重写这个复杂的查询,让mysql优化器能够以更优化的方式执行这个查询。
mysql查询执行路径
- 客服端发送一条查询给服务器
- 服务器先检查缓存。如果命中缓存,则立刻返回结果。否则进入下一阶段。
- 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划。
- mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询。
- 将结果返回给客户端
mysql> show full processlist; +----+------+-----------+--------+---------+------+-------+------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+--------+---------+------+-------+------------------------+ | 39 | root | localhost | sakila | Sleep | 4 | | NULL | | 40 | root | localhost | sakila | Query | 0 | NULL | show full processlist | +----+------+-----------+--------+---------+------+-------+------------------------+ 2 rows in set (0.00 sec)
一条查询可以有很多种执行方式,最后都返回相同的结果。 优化器的作用就是找到这其中最好的执行计划。 mysql使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。 通过查询当前会话的last_query_cost的值来得知Mysql计算的当前查询的成本。 mysql>selectcount(*) from film_actor; +----------+|count(*) |+----------+|5462|+----------+1 row inset (0.00 sec)
mysql> show status like 'last_query_cost'; +-----------------+-------------+ | Variable_name | Value | +-----------------+-------------+ | Last_query_cost | 1040.599000 | +-----------------+-------------+
- 统计信息不准确
- 执行计划中的成本估算不等同于实际执行的成本。
- 有的计划虽然要读取更多页,但是这些页在缓存中。
- mysql的最有可能和你想的最优不一样。
- 比如你希望执行时间尽可能的短,而mysql只是基于成本模型选择的最优执行计划。
- mysql从不考虑其他并发执行的查询,这可能会影响到当前查询速度。
- mysql不会考虑不受其控制的操作的成本。
- 如执行存储过程或者用户自定义函数的成本
- 静态优化
- 直接对解析树进行分析,并完成优化。优化器通过一些简单的代数变换将where条件转换成另一种等价形式。静态优化在第一次完成后一直有效。可以认为这是一种"编译时优化"
- 动态优化
- 动态优化和查询的上下文有关。也和其他很多因素有关,例如where中的取值,索引中条目,等等。每次查询的时候都重新评估,可以认为这是一种"运行时优化"
- 重新定义关联表的顺序。
- 将外联结转成内连接
- 使用等价变化规则
- 合并和减少一些比较,移除一些恒成立和一些恒不成立的判断
- 优化count(),min(),max(),min()就直接拿BTree树最左端数据行
- 预估并转换为常数表达式
- 覆盖索引扫描
- 子查询优化
- 提前终止查询
- 等值传播
1 关联子查询 mysql的子查询实现得非常糟糕;最糟糕的一类查询是where条件中包含IN()的子查询语句。 例如,我们希望找到sakila数据库中,演员actor_id为1,参演过的所有影片信息。很自然的,我们会按照下面的方式
mysql> select * from film where film_id in ( select film_id from film_actor where actor_id =1) \G;
select * from film where film_id in (1,23,25,106,140);
limit 20;会将actor中200条记录和customer中599条记录放在一个临时表中,然后在从临时表中取出前20条; 而 (select first_name,last_name from sakila.actor orderby last_name
查询
数据
索引
成本
业务
结果
时间
时候
服务器
关联
服务
条件
缓存
分析
变化
信息
子句
字段
客户
客户端
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库 表示终端在线
联想服务器售后电话多少
如何发掘软件开发需求
涡阳窦胜软件开发工作室
网络安全学什么呢
长沙拼接服务器供应商
软件开发档案资料
浙江全闪块分布式存储数据库
辽宁网络技术服务业务
国外https代理服务器
tera忘记服务器
20g数据库能存多少东西
微信转信息完成网络安全吗
云浮市网络安全宣传周
云端数据库什么原理
mysql数据库cmd
会员储值管理软件开发
海康威视监控改服务器
电视剧电竞改网络安全
服务器实现远程管理
万得数据库软件下载
商品管理后台如何传服务器
法院网络安全培训方案
集团公司网络安全会议
软件开发项目都有什么
服务器软件包
危害计算机网络安全的方式
后宫秘史服务器维护好几个小时
放心软件开发服务标准
江苏握特网络技术有限公司