优化SQL语句一般步骤

1. 通过show status命令了解各种SQL的执行频率

即查询到当前session执行select、insert、update、delete操作的次数,了解到当前数据库的应用是以更新为主还是以查询为主,以及各种类型的SQL大致的执行比例是多少。

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

此外,以下几个参数便于我们了解数据库的基本情况。

  • Connections:试图连接MySQL服务器的次数
  • Update:服务器工作时间
  • Slow_queries:慢查询的次数

2.定位执行效率较低的SQL语句

1)通过慢查询日志定位那些执行效率较低的SQL语句
(包含所有执行时间超过long_query_time秒的SQL语句的日志文件)

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

3.通过explain分析低效SQL的执行计划

通过以上步骤查询到效率低的SQL语句后,可以通过explain或者desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。

查询出的结果中的参数type表示在表中找到所需行的方式,或者叫访问类型,常见类型如下:

ALLindexrangerefeq_refconst,systemNULL

从左至右,性能由最差到最好。

  1. type = ALL,全表扫描
  2. type = index,索引全扫描
  3. type = range,索引范围扫描,常见于<、>=、between等操作符
  4. type = ref,使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行
  5. type = eq_ref,类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配;简单来说,就是多表连接中使用primary key或者unique index作为关联条件
  6. type = const/system,单表中最多有一个匹配行,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当作常量来处理,例如,根据主键primary key或者唯一索引unique index进行的查询
  7. type = NULL,MySQL不用访问表或者索引,直接就能够得到结果

4.通过show profile分析SQL

通过profile,我们能够清楚地了解SQL执行的过程,例如,我们知道MyISAM表有表元数据的缓存(例如行数,即count()值),那么对于一个MyISAM表的count(*)是不需要消耗太多资源的,而对于InnoDB来说,就没有这种元数据缓存,count()执行得较慢。通过show profile for query 语句可以看到执行过程中线程得每个状态和消耗的时间,可以看出在InnoDBb表中执行count()过程中时间主要消耗在Sending data 这个状态上,(这个状态表示MySQL线程开始访问数据行并把结果返回给客户端),而同样表结构和数据量的MyISAM引擎表在executing之后直接就结束查询,完全不需要访问数据。

5.通过trace分析优化器如何选择执行计划

MySQL提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划,帮助我们更好地理解优化器的行为。

6.确定问题并采取相应的优化措施

经过以上步骤,基本就可以确认问题出现的原因。此时可以根据情况采取相应的措施,进行优化以提高执行的效率。比如创建索引,索引可以大大提高数据库的访问速度,尤其在表很庞大的时候这种优势更为明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值