-
Notifications
You must be signed in to change notification settings - Fork 54
IO Statistics
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语句,同时记录执行时间和逻辑读、物理读。