如果突然交给你一个你完全不清楚的数据库让你进行优化,可能我们需要对sql语句进行优化,我们需要又怎么样的思路:

1.首先我们要了解一下次库是以写为主还是读为主:

通过show [session|global] status like '%Com_%'查询当前数据库的状态,session是当前连接的,global是自从上次数据库启动后的。默认不写是session

| Com_select     | 2     |

| Com_insert     | 0     |

| Com_update   | 0     |

| Com_delete    | 0     |

后面表示累加的执行次数,所有的存储引擎都可以进行累加

show [session|global] status like '%Innodb_rows_%'

+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Innodb_rows_deleted | 0 |
| Innodb_rows_inserted | 7 |
| Innodb_rows_read | 6 |
| Innodb_rows_updated | 0 |
+----------------------+-------+

这个是只针对innodb引擎的。

通过上述结果我们就能大致知道该库是读为主还是写为主了,更新操作的commit和rollback计数都会加1

Com_commit和Com_rollback中,后者很频繁可能是应用有问题

 

2.其次我们要定位效率低的sql语句,可以用以下两种方式进行:

(1)通过慢查询日志:5.6中是slow_query_log_file中查看,缺点是:这个是只有在查询结束后彩记录,所以在应用向你反映效率问题时慢查询日志并不能及时反馈,也许执行的语句还没写进去。

(2)针对上面问题,可以用 show processlist命令查看MySQL进行的线程,包括状态、是否锁表等。可以实时查看SQL执行情况,同时对一些锁表操作进行优化

3.通过explain分析效率低下的 sql执行计划:

当通过上述方式找到效率不高的sql语句后,通过explain或者desc可以分析效率低下的sql的执行计划

4.根据分析得出的问题解决效率低下问题:

通过上述几步就可以得出问题所在,比如进行全表扫描,那么我们可以通过建立索引提高效率

 

posted on 2015-09-25 14:15  guols0612  阅读(550)  评论(0编辑  收藏  举报