2013-06-26 85 views
0

我得到了從我的amazon RDS實例運行的slowquery日誌,我可以使用「sloquery.log」格式的自定義腳本來檢索它們。Mysql - 緩慢的查詢輸出

我的問題很簡單,是否有任何格式化程序可以使報告更「可讀」。

電流輸出是這樣的:

http://i.imgur.com/RUew7gS.png

感謝

回答

1

我敲了這粗糙的PHP腳本來提取日誌到CSV格式,這意味着我可以很容易地用電子表格操縱它。

你將不得不改變輸入和輸出位置(我只是將日誌拖到我的本地主機,然後在那裏運行腳本)。

<?php 
set_time_limit(240); 
$handle = fopen('C:\\Users\\kwalker\\Downloads\\mysql-slow.log', "rb"); 
$fp = fopen('file.csv', 'w'); 
$inline = ''; 
$inline = fgets($handle, 8192); 
$OutLine = array(); 
$OutLine['Time'] = 'Time'; 
$OutLine['Timestamp'] = 'Timestamp'; 
$OutLine['User'] = 'User'; 
$OutLine['Query_time'] = 'Query_time'; 
$OutLine['Lock_time'] = 'Lock_time'; 
$OutLine['Rows_sent'] = 'Rows_sent'; 
$OutLine['Rows_examined'] = 'Rows_examined'; 
$OutLine['Database'] = 'Database'; 
$OutLine['SqlOut'] = 'SqlOut'; 
WriteOut($fp, $OutLine); 
$OutLine = array(); 
$OutLine['Time'] = ''; 
$OutLine['Timestamp'] = ''; 
$OutLine['User'] = ''; 
$OutLine['Query_time'] = ''; 
$OutLine['Lock_time'] = ''; 
$OutLine['Rows_sent'] = ''; 
$OutLine['Rows_examined'] = ''; 
$OutLine['Database'] = ''; 
$OutLine['SqlOut'] = ''; 
$PossibleUse = true; 
$TimeTriggeredOut = true; 
$CurrentTime = ''; 
$CurrentDatabase = ''; 

while (!feof($handle)) 
{ 
    switch (true) 
    { 
     case substr($inline, 0, 8) == '# Time: ' : 
      WriteOut($fp, $OutLine); 
      $PossibleUse = true; 
      $Timings = explode(': ', $inline); 
      $CurrentTime = $Timings[1]; 
      $OutLine = array(); 
      $OutLine['Time'] = $CurrentTime; 
      $OutLine['Timestamp'] = ''; 
      $OutLine['User'] = ''; 
      $OutLine['Query_time'] = ''; 
      $OutLine['Lock_time'] = ''; 
      $OutLine['Rows_sent'] = ''; 
      $OutLine['Rows_examined'] = ''; 
      $OutLine['Database'] = $CurrentDatabase; 
      $OutLine['SqlOut'] = ''; 
      $TimeTriggeredOut = true; 
      break; 
     case substr($inline, 0, 6) == '# User' : 
      if (!$TimeTriggeredOut) 
      { 
       WriteOut($fp, $OutLine); 
       $PossibleUse = true; 
       $OutLine = array(); 
       $OutLine['Time'] = $CurrentTime; 
       $OutLine['Timestamp'] = ''; 
       $OutLine['User'] = ''; 
       $OutLine['Query_time'] = ''; 
       $OutLine['Lock_time'] = ''; 
       $OutLine['Rows_sent'] = ''; 
       $OutLine['Rows_examined'] = ''; 
       $OutLine['Database'] = $CurrentDatabase; 
       $OutLine['SqlOut'] = ''; 
      } 
      $OutLine['User'] = $inline; 
      $TimeTriggeredOut = false; 
      break; 
     case substr($inline, 0, 12) == '# Query_time' : 
      $Timings = explode(' ', $inline); 
      //print_r($Timings); 
      $OutLine['Query_time'] = $Timings[2]; 
      $OutLine['Lock_time'] = $Timings[5]; 
      $OutLine['Rows_sent'] = $Timings[7]; 
      $OutLine['Rows_examined'] = $Timings[10]; 
      $PossibleUse = true; 
      break; 
     case substr($inline, 0, 14) == 'SET timestamp=' : 
      $Timings = explode('=', $inline); 
      $OutLine['Timestamp'] = $Timings[1]; 
      $PossibleUse = true; 
      break; 
     case $PossibleUse AND substr($inline, 0, 4) == 'use ' : 
      $Timings = explode(' ', $inline); 
      $CurrentDatabase = $Timings[1]; 
      $OutLine['Database'] = $CurrentDatabase; 
      $PossibleUse = false; 
      break; 
     default; 
      $OutLine['SqlOut'] .= $inline; 
    } 
    $inline = fgets($handle, 8192); 
} 
fclose($fp); 
fclose($handle); 

function WriteOut($fp, $OutLine) 
{ 
    foreach($OutLine as &$aOutLine) 
    { 
     $aOutLine = str_replace("\n", " ", $aOutLine); 
     $aOutLine = str_replace("\r", " ", $aOutLine); 
     $aOutLine = str_replace("\t", " ", $aOutLine); 
    } 
    fputcsv($fp, $OutLine); 
} 
?>