在本次学习中,使用的案例表是MySQL的的案例库的Sakila,sakila的的下载地址是:http://downloads.mysql.com/docs/sakila-db.zip。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------
第一步:在sql优化的第一步,我们应该了解该数据库表中各种SQL的执行频率。使用命令:show status
mysql> show status like 'Com_%';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| Com_admin_commands | 0 |
| Com_assign_to_keycache | 0 |
| Com_alter_db | 0 |
| Com_alter_db_upgrade | 0 |
| Com_alter_event | 0 |
| Com_alter_function | 0 |
| Com_alter_procedure | 0 |
| Com_alter_server | 0 |
| Com_alter_table | 2 |
| Com_alter_tablespace | 0 |
| Com_analyze | 0 |
| Com_begin | 0 |
| Com_binlog | 0 |
| Com_call_procedure | 0 |
| Com_change_db | 3 |
| Com_change_master | 0 |
| Com_check | 0 |
| Com_checksum | 0 |
| Com_commit | 15 |
.....
解释:Com_xxx表示每个XXX语句执行的次数,我们通常比较关心的是以下几个统计参数。
- Com_select:执行SELECT操作次数,一次查询只累加1。
- Com_insert:执行INSERT操作次数,对于批量插入的INSERT操作,只累加一次。
- Com_update:执行UPDATE修改操作的次数。
- Com_delete:执行删除操作删除的次数。
上面这些参数对所有的存储引擎表操作都会进行累计以下这几个参数只针对在InnoDB的存储引擎,累加的算法也略有不同:
- Innodb_rows_read:SELECT查询返回的行数。
- Innodb_rows_inserted:执行INSERT操作插入的行数
- Innodb_rows_updated:执行UPDATE操作更新的行数
- Innodb_rows_deleted:执行删除操作删除的行数
通过以上几个参数,大家很容易了解当前数据库是以插入更新为主还是查询操作为主,以及各种类型的SQL大致执行的比例是多少。对于更新操作的计数,是对执行次数的计数,不论是提交还是回滚都会进行累加。
对于事务的型的应用,通过Com_commit和Com_callback可以了解事务提交和回滚的情况,对于回滚操作频繁的数据库,可能意味着应用编写存在问题。
以下几个参数便于用户了解数据库的基本情况,
- Connections:试图连接MySQL服务器的次数
- 运行时间:服务器工作时间
- Slow_queries要花:慢查询的次数
第二步:定位执行效率较低的SQL语句
1)通过慢查询日志定位那些执行效率较低的SQL语句。
用--log-slow-queries [= file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的sql语句文件。
2)慢查询在查询结束后才记录,所以在反应映射执行效率出现问题的时候慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态,是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操作进行优化。
以上是对数据库的SQL优化中,对数据库表中各种SQL的操作频率和低效率的SQL的定位。