5.8.1.12 语句探针

提供各个语句探针以提供有关不同语句类型的特定信息。对于启动探针,将提供查询的字符串作为唯一参数。根据语句类型,相应的 done 探针提供的信息将有所不同。对于所有完成的探测,将提供操作状态(0table 示成功,>0table 示失败)。对于SELECTINSERT插入...(选择...)DELETE从 t1,t2 删除操作,返回受影响的行数。

对于UPDATE更新 t1,t2 ...语句,提供了匹配的行数和实际更改的行数。这是因为相应的WHERE子句实际匹配的行数和更改的行数可能不同。如果该值已经与新设置匹配,则 MySQL 不会更新该行的值。

select-start(query)
select-done(status,rows)

insert-start(query)
insert-done(status,rows)

insert-select-start(query)
insert-select-done(status,rows)

update-start(query)
update-done(status,rowsmatched,rowschanged)

multi-update-start(query)
multi-update-done(status,rowsmatched,rowschanged)

delete-start(query)
delete-done(status,rows)

multi-delete-start(query)
multi-delete-done(status,rows)
  • select-start:在SELECT语句之前触发。

  • select-done:在SELECT语句的末尾触发。

  • insert-start:在INSERT语句之前触发。

  • insert-done:在INSERT语句的末尾触发。

  • insert-select-start:在插入...选择语句之前触发。

  • insert-select-done:在插入...选择语句的末尾触发。

  • update-start:在UPDATE语句之前触发。

  • update-done:在UPDATE语句的末尾触发。

  • multi-update-start:在涉及多个 table 的UPDATE语句之前触发。

  • multi-update-done:在涉及多个 table 的UPDATE语句的末尾触发。

  • delete-start:在DELETE语句之前触发。

  • delete-done:在DELETE语句的末尾触发。

  • multi-delete-start:在涉及多个 table 的DELETE语句之前触发。

  • multi-delete-done:在涉及多个 table 的DELETE语句的末尾触发。

语句探针的参数为:

  • query:查询字符串。

  • status:查询的状态。 0table 示成功,>0table 示失败。

  • rows:受语句影响的行数。这将返回为SELECT找到的行数,为DELETE删除的行数以及为INSERT成功插入的行数。

  • rowsmatched:与UPDATE操作的WHERE子句匹配的行数。

  • rowschanged:在UPDATE操作期间实际更改的行数。

您可以使用这些探针来监视这些语句类型的执行,而不必监视执行语句的用户或 Client 端。一个简单的例子是跟踪执行时间:

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN
{
   printf("%-60s %-8s %-8s %-8s\n", "Query", "RowsU", "RowsM", "Dur (ms)");
}

mysql*:::update-start, mysql*:::insert-start,
mysql*:::delete-start, mysql*:::multi-delete-start,
mysql*:::multi-delete-done, mysql*:::select-start,
mysql*:::insert-select-start, mysql*:::multi-update-start
{
    self->query = copyinstr(arg0);
    self->querystart = timestamp;
}

mysql*:::insert-done, mysql*:::select-done,
mysql*:::delete-done, mysql*:::multi-delete-done, mysql*:::insert-select-done
/ self->querystart /
{
    this->elapsed = ((timestamp - self->querystart)/1000000);
    printf("%-60s %-8d %-8d %d\n",
           self->query,
           0,
           arg1,
           this->elapsed);
    self->querystart = 0;
}

mysql*:::update-done, mysql*:::multi-update-done
/ self->querystart /
{
    this->elapsed = ((timestamp - self->querystart)/1000000);
    printf("%-60s %-8d %-8d %d\n",
           self->query,
           arg1,
           arg2,
           this->elapsed);
    self->querystart = 0;
}

执行后,您可以看到基本执行时间和行匹配:

Query                                                        RowsU    RowsM    Dur (ms)
select * from t2                                             0        275      0
insert into t2 (select * from t2)                            0        275      9
update t2 set i=5 where i > 75                               110      110      8
update t2 set i=5 where i < 25                               254      134      12
delete from t2 where i < 5                                   0        0        0

另一种选择是使用 DTrace 中的聚合函数将单个语句的执行时间聚合在一起:

#!/usr/sbin/dtrace -s

#pragma D option quiet

mysql*:::update-start, mysql*:::insert-start,
mysql*:::delete-start, mysql*:::multi-delete-start,
mysql*:::multi-delete-done, mysql*:::select-start,
mysql*:::insert-select-start, mysql*:::multi-update-start
{
    self->querystart = timestamp;
}

mysql*:::select-done
{
        @statements["select"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::insert-done, mysql*:::insert-select-done
{
        @statements["insert"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::update-done, mysql*:::multi-update-done
{
        @statements["update"] = sum(((timestamp - self->querystart)/1000000));
}

mysql*:::delete-done, mysql*:::multi-delete-done
{
        @statements["delete"] = sum(((timestamp - self->querystart)/1000000));
}

tick-30s
{
        printa(@statements);
}

刚刚显示的脚本汇总了执行每个操作所花费的时间,可用于帮助基准测试标准套件。

delete                                                            0
  update                                                            0
  insert                                                           23
  select                                                         2484

  delete                                                            0
  update                                                            0
  insert                                                           39
  select                                                        10744

  delete                                                            0
  update                                                           26
  insert                                                           56
  select                                                        10944

  delete                                                            0
  update                                                           26
  insert                                                         2287
  select                                                        15985