关于sql优化(一)
在开发应用过程中,对数据的处理是比较重视的过程,因此对于优化sql或者是写出更加高效并且合适的sql尤为重要,下面我将描述sql优化的方法。
当一个sql性能有问题时,我们怎么样快速定位出该sql暴露出来的问题呢?
第一、通过show status命令了解sql的执行频率。
mysql连接成功后,通过show[session/global] status命令可以获取服务器状态信息,session和global来分别显示“当前连接”的统计结果和“数据库上次启动至今”的统计结果,不写的话,默认为session级别。
com_xxx表示每个xxx语句的执行次数,比如一下几个操作的次数:
com_select:执行select的次数,一次查询只累加1。
com_insert:执行insert的次数,对于批量插入的insert操作,只累加一次。
com_update:执行update的次数。
com_delete:执行delete的次数。
对于Innodb存储引擎的(关于mysql存储引擎请参考这篇文章《mysql存储引擎介绍》),累加的算法略有不同。
Innodb_rows_read:select查询返回的行数。
Innodb_rows_inserted:insert操作插入的行数。
Innodb_rows_updated:update操作更新的行数。
Innodb_rows_deleted:delete操作删除的行数。
通过这些参数,可以知道该数据库是以插入、更新为主,还是查询为主,以及sql的执行大致比例。
另外,可以通过com_commit,com_rollback了解事务的提交和回滚的情况,对于回滚比较频繁的数据库,可能代码上会有问题。
第二、通过explain分析低效率sql的执行
简单解析下列的意思:
select_type:表示select的类型,simple(简单查询-不使用表连接或者子查询)、primary(主查询)、union(union的第二个或者后面的查询语句)、subquery(子查询中的第一个select)等。
table:输出结果的表。
type:表示mysql在表中找到所需行的方式,也可以叫做访问类型。
ALL | index | range | ref | eq_ref | const,system | NULL |
从左至右,性能从最差到最好。
type=ALL:全表扫描,遍历全表来找到匹配的行,显而易见效率最低。
type=index:索引全扫描,遍历整个索引来查询匹配的行。
type=range:索引范围扫描,常用于<、<=、>、>=、between等操作符。
type=ref:使用非唯一索引扫描或者唯一索引的前缀扫描(类似index(n)表示前n个),返回匹配某个单独值的记录行。
type=eq_ref:使用唯一索引扫描,就是多表连接中使用primary key 或者 unique index作为关联条件。
type=const,system:单表最多有一个匹配行,查询出来非常迅速,所以这个匹配行的其他列的值可以被优化器在当前查询中当作常量来处理。
type=NULL:mysql不访问表或者索引,比如:select 1 from dual。
原文地址https://blog.csdn.net/kecong532664/article/details/79800400