位置: 编程技术 - 正文

sql语句优化的一般步骤详解(sql语句优化的13种方法)

编辑:rootadmin

推荐整理分享sql语句优化的一般步骤详解(sql语句优化的13种方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql语句的优化方式,sql语句的优化方式,sql语句优化的一般步骤是,sql优化的一般步骤,sql优化有哪些,sql语句优化的一般步骤是,sql语句优化的几种方法,sql语句优化的一般步骤是,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

本文主要给大家分享了关于sql语句优化的一般步骤,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一、通过 show status 命令了解各种 sql 的执行频率

mysql 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extend-status 命令获取这些消息。

show status 命令中间可以加入选项 session(默认) 或 global:

session (当前连接) global (自数据上次启动至今)

我们通常比较关心的是以下几个统计参数:

Com_select : 执行 select 操作的次数,一次查询只累加 1。 Com_insert : 执行 insert 操作的次数,对于批量插入的 insert 操作,只累加一次。 Com_update : 执行 update 操作的次数。 Com_delete : 执行 delete 操作的次数。

上面这些参数对于所有存储引擎的表操作都会进行累计。下面这几个参数只是针对 innodb 的,累加的算法也略有不同:

Innodb_rows_read : select 查询返回的行数。 Innodb_rows_inserted : 执行 insert 操作插入的行数。 Innodb_rows_updated : 执行 update 操作更新的行数。 Innodb_rows_deleted : 执行 delete 操作删除的行数。

通过以上几个参数,可以很容易地了解当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的 sql 大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不论提交还是回滚都会进行累加。

对于事务型的应用,通过 Com_commit 和 Com_rollback 可以了解事务提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。

此外,以下几个参数便于用户了解数据库的基本情况:

Connections : 试图连接 mysql 服务器的次数。 Uptime : 服务器工作时间。 Slow_queries : 慢查询次数。

二、定义执行效率较低的 sql 语句

1. 通过慢查询日志定位那些执行效率较低的 sql 语句,用 --log-slow-queries[=file_name] 选项启动时,mysqld 写一个包含所有执行时间超过 long_query_time 秒的 sql 语句的日志文件。

2. 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前 mysql 在进行的线程,包括线程的状态、是否锁表等,可以实时的查看 sql 的执行情况,同时对一些锁表操作进行优化。

三、通过 explain 分析低效 sql 的执行计划

测试数据库地址: email 为租赁电影拷贝所支付的总金额,需要关联客户表 customer 和 付款表 payment , 并且对付款金额 amount 字段做求和(sum) 操作,相应的执行计划如下:

select_type: 表示 select 类型,常见的取值有: simple:简单表,及不使用表连接或者子查询 primary:主查询,即外层的查询 union:union 中的第二个或后面的查询语句 subquery: 子查询中的第一个 select table : 输出结果集的表 type : 表示 mysql 在表中找到所需行的方式,或者叫访问类型,常见类型性能由差到最好依次是:all、index、range、ref、eq_ref、const,system、null:

1.type=ALL,全表扫描,mysql 遍历全表来找到匹配的行:

2.type=index, 索引全扫描,mysql 遍历整个索引来查询匹配的行

sql语句优化的一般步骤详解(sql语句优化的13种方法)

3.type=range,索引范围扫描,常见于<、<=、>、>=、between等操作:

4.type=ref, 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行,例如:

索引 idx_fk_customer_id 是非唯一索引,查询条件为等值查询条件 customer_id = , 所以扫描索引的类型为 ref。ref 还经常出现在 join 操作中:

5.type=eq_ref,类似 ref,区别就在使用的索引时唯一索引,对于每个索引的键值,表中只要一条记录匹配;简单的说,就是多表连接中使用 primary key 或者 unique index 作为关联条件。

6.type=const/system,单表中最多有一个匹配行,查起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当作常量来处理,例如,根据主键 primary key 或者唯一索引 unique index 进行查询。

7.type=null, mysql 不用访问表或者索引,直接就能够得到结果:

  类型 type 还有其他值,如 ref_or_null (与 ref 类似,区别在于条件中包含对 null 的查询)、index_merge(索引合并优化)、unique_subquery (in 的后面是一个查询主键字段的子查询)、index_subquery(与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询)等。

possible_keys : 表示查询时可能使用的索引。 key :表示实际使用索引 key-len : 使用到索引字段的长度。 rows : 扫描行的数量 extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。

show warnings 命令

执行explain 后再执行 show warnings,可以看到sql 真正被执行之前优化器做了哪些 sql 改写:

从 warning 的 message 字段中能够看到优化器自动去除了 1=1 恒成立的条件,也就是说优化器在改写 sql 时会自动去掉恒成立的条件。

explain 命令也有对分区的支持.

可以看到 sql 访问的分区是 p2。

四、通过 performance_schema 分析 sql 性能

旧版本的 mysql 可以使用 profiles 分析 sql 性能,我用的是5.7.的版本,已经不允许使用 profiles 了,推荐用performance_schema 分析sql。

五、通过 trace 分析优化器如何选择执行计划。

mysql5.6 提供了对 sql 的跟踪 trace,可以进一步了解为什么优化器选择 A 执行计划而不是 B 执行计划,帮助我们更好的理解优化器的行为。

使用方式:首先打开 trace ,设置格式为 json,设置 trace 最大能够使用的内存大小,避免解析过程中因为默认内存过小而不能够完整显示。

接下来执行想做 trace 的 sql 语句,例如像了解租赁表 rental 中库存编号 inventory_id 为 的电影拷贝在出租日期 rental_date 为 -- 4:: ~ 5:: 之间出租的记录:

六、 确定问题并采取相应的优化措施

经过以上步骤,基本就可以确认问题出现的原因。此时可以根据情况采取相应的措施,进行优化以提高执行的效率。

总结

标签: sql语句优化的13种方法

本文链接地址:https://www.jiuchutong.com/biancheng/348632.html 转载请保留说明!

上一篇:Mysql启动报ERROR:2002的分析与解决(启动mysql1067错误)

下一篇:mysql数据库无法被其他ip访问的解决方法(mysql数据库无法连接到服务器怎么办)

  • 水资源费如何入账
  • 投资收益属于什么账户
  • 制造业印花税计税,按照去税金额计算
  • 建筑公司外包工程收入怎么记账
  • 找贴现公司贴现有风险吗
  • 报销增值税专票绿的
  • 一般纳税人抵扣小规模期间的专票怎么解决
  • 建筑业发票可以在备注里加备注么
  • 应交税金明细账余额怎么算
  • 换汇成本跟进项有关系吗
  • 增值税只有销项没有进项怎么做账
  • 小苏打税收分类
  • 什么情形下可以认定为重婚
  • 个人二手房转让税费
  • 购入的汽车怎么入账
  • 集团公司收购子公司
  • 所有者权益合计是负数是什么意思
  • 拿库存商品抵债怎么做账
  • linux安装c语言环境
  • 预收账款与应收账款为什么合并
  • 普通增值税发票左上角的二维码可以扫出来吗?
  • 民非组织可以接受捐赠吗
  • 惠普笔记本电源适配器
  • PHP:xml_error_string()的用法_XML解析器函数
  • 冲减预付款
  • 操作系统的内存映射
  • 担保公司计提的费用
  • 房屋装修费如何入账
  • 收到员工罚款分录怎么记账
  • RuntimeError: (PreconditionNotMet) The third-party dynamic library (cudnn64_7.dll) that Paddle depen
  • PHP:mcrypt_enc_get_block_size()的用法_Mcrypt函数
  • 业务招待费财务管理制度
  • 微信php开发教程
  • 注销公司需要缴纳注册资金吗
  • 善意取得虚开增值税专用发票处理
  • 固定资产清理的会计科目处理
  • php上级目录
  • php年月日时间代码
  • cmd more命令
  • 售后租回融资租赁帐务处理怎么做?
  • 工资预提和计提的区别
  • 增值税专票怎么交税
  • 年终奖的个税税率
  • 股权和出资的关系
  • 国税发1997191号文有效吗
  • 员工缴纳工伤保险怎么赔偿
  • 增值税扣税公式
  • 收到股东投资如何做账
  • 结转成本应附什么原始凭证
  • 投资方持有的能够对被投资单位实施
  • 利息收入和利息费用是一个科目吗
  • 出口的样品如何销售
  • 免费领课程有什么陷阱
  • 重新计量设定受益计划变动额计入
  • windows8计算机在哪儿
  • ubuntu16.04终端在哪
  • 今后64位Win10 Mobile将是未来重点
  • 右下角小喇叭调不了声音
  • 怎样禁用ie
  • hyper虚拟机连接外网
  • win7唤醒后屏幕黑屏
  • linux 命令连接
  • linux中安装命令
  • jquery()
  • 求婚表白的语句
  • cocos2d-js游戏开发
  • Unity3D游戏开发(第2版)
  • javascript运用
  • for 命令
  • 动作手游排行榜2020前十名
  • unity3d asset store
  • 面向对象设计六大原则
  • jquery示例
  • 圣诞树代码html
  • JavaScript onkeydown事件入门实例(键盘某个按键被按下)
  • css图片渐变效果
  • 如何查询税务是否变更
  • 山东省水资源税征收标准
  • 四川4050社保补贴政策什么时候发放
  • 土地增值税的房屋转让指出售 赠与
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设