Skip to content
bluethinking edited this page Oct 18, 2012 · 4 revisions
  1. 简介
    InnoSQL IO Statistic是用来统计SQL语句的IO请求,通过配置相关IO或者时间的阈值,记录IO或者时间开销大于设置阈值的SQL的IO信息,帮助数据库使用者了解相关SQL的IO使用情况,进而查找性能瓶颈,优化执行SQL,所有IO Statistic的信息都记录到slow log中,为了方便查看,在show profile也添加了相关SQL的IO信息。
  2. 原理
    SQL在执行时,都需要访问buf_pool来获取数据,只通过buf_pool获取数据我们称之为逻辑读(logical_reads),对于buf_pool中不存在的数据,需要通过读取磁盘数据来获得,这个我们称之为物理读(physical_reads),我们就是通过统计访问buf_pool和物理文件的次数来统计一条SQL
    的logical_reads和physical_reads。
  3. 实现
    修改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
  4. 配置
    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