3. 如何查询某条语句的索引使用情况?
可用EXPLAIN语句来看一下某条SELECT语句的索引使用情况。如果是UPDATE或DELETE语句,需要先转换为SELECT语
句。
4. 如何把导出INNODB引擎的内容到错误日志文件中?
我们可以使用SHOW INNODB STATUS命令来查看INNODB引擎的很多有用的信息,如当前进程、事务、外键错误、死锁问
题和其它一些统计数据。如何让该信息能记录在日志文件中呢?只要使用如下语句创建innodb_monitor表,MySQL就会每15
秒钟把该系统写入到错误日志文件中:
代码如下:
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
如果你不再需要导出到错误日志文件,只要删除该表即可:
代码如下:
DROP TABLE innodb_monitor;
5. 如何定期删除庞大的日志文件?
只要在启动配置文件中设置日志过期时间即可:
代码如下:
expire_logs_days=10
经验教训
1. 重点关注索引
下面以表TSK_TASK表为例说明SQL语句优化过程。TSK_TASK表用于保存系统监测任务,相关字段及索引如下:
ID:主键;
MON_TIME:监测时间;建了索引;
STATUS_ID:任务状态;与SYS_HIER_INFO.ID建立了外键关系。
注MySQL自动会为外键建立索引,在本次优化过程中,发现这些自动建立的外键索引会对SQL语句的效率产生不必要的干
扰,需要特别注意!
首先,我们在日志文件中查到下面语句的执行比较慢,超过10秒了:
代码如下:
# Query_time: 18 Lock_time: 0 Rows_sent: 295 Rows_examined: 88143
select * from TSK_TASK WHERE STATUS_ID = 1064 and MON_TIME >= ‘2007-11-22’ and MON_TIME < ‘2007-11-23’;
哦,原来在88143条记录中要查出符合条件的295条记录,那当然慢了。赶紧用EXPLAIN语句看一下索引使用情况吧:
+—-+————-+———-+——+———————————————————-+————————————+———+——-+
——–+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———-+——+———————————————————-+————————————+———+——-+
——–+————-+
| 1 | SIMPLE | TSK_TASK | ref | FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME |
FK_task_status_id_TO_SYS_HIER_INFO | 9 | const | 276168 | Using where |
+—-+————-+———-+——+———————————————————-+————————————+———+——-+
——–+————-+
可以看出,有两个索引可用FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME,而最终执行语句时采
用了STATUS_ID上的外键索引。
再看一下TSK_TASK表的索引情况吧: