SQL业务审核与优化
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,转自http://www.cnblogs.com/Aiapple/p/5697229.html审核什么是业务审核类似与code review评审业务Schema和SQL设计偏重关注性能是业务优化的主要
千家信息网最后更新 2025年01月28日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安全错误
数据库的锁怎样保障安全
天津网警检查网络安全
2019网络安全图
pop服务器设置
交通终端服务器安装施工
河南新天软件开发怎么样
2012年三级网络技术查询
网络安全和java哪个易学
ps5系统升级服务器连接
赴日软件开发工程师
梧桐顿诺网络技术服务部
个人云服务器租用
成都的软件开发
行业网络安全等级保护
微信公众号服务器配置
升级网络安全
大学生数据库系统概论期末考试题
佛山水电缴费软件开发团队
网络安全数据安全上市公司
江苏软件开发单位
滨州服务器管理系统
河北水性软件开发试验设备
计量标准技术报告数据库
南京乐动网络技术有限公司
一个服务器部署两个云数据库
用友t6的数据库在哪里
黑客能更改银行数据库系统吗
网络安全班队会视频
网络安全为主题的手抄报清晰
如何查找代理服务器端口
软件开发转软件算法