Skip to content
bluethinking edited this page Oct 18, 2012 · 6 revisions

简介

InnoSQL IO Statistic是用来统计SQL语句的IO请求,通过配置相关IO或者时间的阈值,记录IO或者时间开销大于设置阈值的SQL的IO信息,帮助数据库使用者了解相关SQL的IO使用情况,进而查找性能瓶颈,优化执行SQL,所有IO Statistic的信息都记录到slow log中,为了方便查看,在show profile也添加了相关SQL的IO信息。

原理

SQL在执行时,都需要访问buf_pool来获取数据,只通过buf_pool获取数据我们称之为逻辑读(logical_reads),对于buf_pool中不存在的数据,需要通过读取磁盘数据来获得,这个我们称之为物理读(physical_reads),我们就是通过统计访问buf_pool和物理文件的次数来统计一条SQL 的logical_reads和physical_reads。

实现

修改mysql.slow_log的表结构如下: | slow_log | CREATE TABLE slow_log ( start_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, user_host mediumtext NOT NULL, query_time time NOT NULL, lock_time time NOT NULL, rows_sent int(11) NOT NULL, rows_examined int(11) NOT NULL, logical_reads int(11) NOT NULL, physical_reads int(11) NOT NULL, db varchar(512) NOT NULL, last_insert_id int(11) NOT NULL, insert_id int(11) NOT NULL, server_id int(10) unsigned NOT NULL, sql_text mediumtext NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' | 相比于原来的slow_log表,增加了logical_reads和physical_reads两项用于统计SQL的逻辑读和物理读,对于记录到文件的slow_log,同样包含logical_reads和physical_reads信息 通过配置long_query_time、long_query_io的阈值,决定本条SQL是否记录到slow_log 通过设置profiling=1,可以在profile中参看相应SQL语句的逻辑读和物理读,如下: mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> select * from tpcc.warehouse; mysql> select * from tpcc.warehouse limit 1; mysql> show profiles\G; *************************** 1. row *************************** Query_ID: 1 Duration: 0.00118225 Logical_reads: 72 Physical_reads: 0 Query: select * from tpcc.warehouse

配置

long_query_time 记录时间大于该参数的SQL语句,不记录InnoDB的逻辑读和物理读次数 long_query_io 记录逻辑读次数大于该值的SQL语句到slow_log,该值默认为100 slow_query_type 该参数可选值为0,1,2,3,表示记录slow query的类型。 0表示不开启slow query功能 1表示记录符合long_query_time条件的SQL语句,不记录逻辑读和物理读次数 2表示记录符合long_query_io条件的SQL语句,不记录SQL的执行时间 3表示记录符合long_query_time和long_query_io中任何一个的SQL语句,同时记录执行时间和逻辑读、物理读。

Clone this wiki locally