表2000行, id主键,98%update正常,突然有一条很慢, 使用show profile查询的结果是下面这个状态占用时间比较长, 
 {
        "Status": "query end",
        "Duration": "1.751142",
        "CPU_user": "0.008999",
        "CPU_system": "0.003999",
        "Context_voluntary": "98",
        "Context_involuntary": "0",
        "Block_ops_in": "8",
        "Block_ops_out": "32",
        "Messages_sent": "0",
        "Messages_received": "0",
        "Page_faults_major": "0",
        "Page_faults_minor": "0",
        "Swaps": "0",
        "Source_function": "mysql_execute_command",
        "Source_file": "sql_parse.cc",
        "Source_line": "4465"
    },
请问这个 "Status": "query end", 状态是什么状态, 这个状态下在执行什么事情?
"Context_voluntary": "98", "Block_ops_in": "8", "Block_ops_out": "32" 这些字段的含义是什么?大多数时候这些字段都是0, 为什么突然一条这几个字段很高?

解决方案 »

  1.   


    status表示状态,query end表示查询已经结束了。Context_voluntary是上下文的切换次数Block_ops_in、Block_ops_out处理数据块的个数。
      

  2.   

    好像只有分析代码了
    1、MySQL是用c写的,那个profiling参数的实现应该类似:
    if (profiling)
      RecordSomething(Struct Status xxStatus);
    2、Status定义需要参考代码,具体处理也可以在代码里找到
    3、每条SQL语句的执行都是一个函数,可以快速浏览这个文件对应行,找到上下文看看都处理了什么
    "Source_function": "mysql_execute_command",
            "Source_file": "sql_parse.cc",
            "Source_line": "4465"
    4、找找MySQL帮助,应该也有说明
    5、可以看看MySQL内核分析的材料,可能会更快
      

  3.   

    一般这类性能问题比较细节,不啃代码难以找到合适的。
    啃代码还是一个要善于坚持的困难任务,何况MySQL好像有百万行?
    看看这个大牛怎么啃的
    http://blog.csdn.net/edwzhang/article/details/7783884