I would like to share the ultimate MySQL performance debugger tool.
Written by my friend Nereu.
The output is like this
The code:
#!/usr/bin/perl # # 2011-11-03 Nereu # 2011-11-05 Nereu - mytop # use DBI; # EDIT HERE FOR USERNAME AND PASSWORD $dbh = DBI->connect('DBI:mysql:mysql', 'root', '') || die "Could not connect to database: $DBI::errstr"; $sth = $dbh->prepare("show processlist"); $sth2 = $dbh->prepare("show global status"); $last=0; $clear_string = `clear`; $S{"Com_select"}=0.0 ; $N{"Com_select"}=0; for(;;) { print $clear_string; $now=time(); $sth2->execute(); while ( $result2 = $sth2->fetchrow_hashref() ) { $q2{$result2->{Variable_name}}=$result2->{Value}; } print "n"; &pu; # UNCOMMENT TO SEE ANY OF THESE VALUES &p("Queries"); &pa("Threads_connected"); # &pa("Open_files"); # &pa("Open_tables"); &p("Key_writes"); &p("Key_write_requests"); &p("Key_reads"); &p("Key_read_requests"); &pv("(Key_blocks_)used/used+unused",$q2{"Key_blocks_used"}/($q2{"Key_blocks_used"}+$q2{"Key_blocks_unused"})*100.0); &pa("Key_blocks_used"); &pa("Key_blocks_unused"); # print "-------------------------------------------n"; # &p("Com_admin_commands"); # &p("Com_alter_table"); # &p("Com_change_db"); # &p("Com_commit"); &pm("Com_delete"); &pm("Com_insert"); # &p("Com_kill"); # &p("Com_lock_tables"); # &p("Com_rollback"); &pm("Com_select"); &p("Com_set_option"); # &p("Com_show_collations"); # &p("Com_show_create_table"); # &p("Com_show_databases"); # &p("Com_show_fields"); # &p("Com_show_processlist"); # &p("Com_show_status"); # &p("Com_show_tables"); # &p("Com_show_triggers"); # &p("Com_show_variables"); &p("Com_stmt_close"); &p("Com_stmt_execute"); &p("Com_stmt_prepare"); # &p("Com_unlock_tables"); # print "-------------------------------------------n"; # &pa("Innodb_buffer_pool_pages_dirty"); # &pa("Innodb_buffer_pool_pages_data"); # &pa("Innodb_buffer_pool_pages_flushed"); # &pa("Innodb_buffer_pool_pages_free"); # &pa("Innodb_buffer_pool_pages_misc"); # &pa("Innodb_buffer_pool_pages_total"); ## &pa("Innodb_buffer_pool_read_ahead_rnd"); # &pa("Innodb_buffer_pool_read_ahead_seq"); # &p("Innodb_buffer_pool_read_requests"); # &pa("Innodb_buffer_pool_reads"); # &pa("Innodb_buffer_pool_wait_free"); # &pa("Innodb_buffer_pool_write_requests"); # &p("Innodb_data_fsyncs"); # &pa("Innodb_data_pending_fsyncs"); # &pa("Innodb_data_pending_reads"); # &pa("Innodb_data_pending_writes"); # &pa("Innodb_data_read"); # &pa("Innodb_data_reads"); # &p("Innodb_data_writes"); # &p("Innodb_data_written"); # &pa("Innodb_dblwr_pages_written"); # &pa("Innodb_dblwr_writes"); # &pa("Innodb_log_waits"); # &pa("Innodb_log_write_requests"); # &pa("Innodb_log_writes"); # &pa("Innodb_os_log_fsyncs"); ## &pa("Innodb_os_log_pending_fsyncs"); # &pa("Innodb_os_log_pending_writes"); # &p("Innodb_os_log_written"); # &pa("Innodb_page_size"); # &p("Innodb_pages_created"); # &pa("Innodb_pages_read"); # &pa("Innodb_pages_written"); # &pa("Innodb_row_lock_current_waits"); # &pa("Innodb_row_lock_time"); # &pa("Innodb_row_lock_time_avg"); # &pa("Innodb_row_lock_time_max"); # &pa("Innodb_row_lock_waits"); # &pa("Innodb_rows_deleted"); # &pa("Innodb_rows_inserted"); # &pa("Innodb_rows_read"); ## &pa("Innodb_rows_updated"); # print "-------------------------------------------n"; # &pa("Qcache_free_blocks"); # &pa("Qcache_free_memory"); # &pa("Qcache_hits"); # &pa("Qcache_inserts"); # &pa("Qcache_lowmem_prunes"); # &pa("Qcache_not_cached"); # &pa("Qcache_queries_in_cache"); # &pa("Qcache_total_blocks"); print "n"; %q1 = %q2; %Host_connected = ( ); $sth->execute(); printf("n%6s %10s %15s %10s %15s %5s %-20s %sn","Id", "User", "Host", "DB", "Command", "Time", "State", "Info"); printf("%6s %10s %15s %10s %15s %5s %-20s %75sn","-" x 6, "-" x 10, "-" x 15, "-" x 10, "-" x 15, "-" x 5, "-" x 20, "-" x 75); while ( $result = $sth->fetchrow_hashref() ) { if ( $result->{Command} ne "Sleep" ) { printf("%6s %10s %15s %10s %15s %5s %-20s %-75sn", $result->{Id}, $result->{User}, $result->{Host}, $result->{db}, $result->{Command}, $result->{Time}, $result->{State}, substr($result->{Info},0,75) ); } $Host_connected{substr($result->{Host},0,index($result->{Host},":"))}++; } print "nThreads per hostnn"; foreach ( sort { $Host_connected{$b} <=> $Host_connected{$a} } keys %Host_connected ) { printf("%-15s : %sn",$_,$Host_connected{$_}); } sleep(2); $last=$now; } # sub p { $delta= ( ($now - $last) == 0 ? 1 : ( $now - $last) ); printf("%28s/s = %.0fn", $_[0], ($q2{$_[0]} - $q1{$_[0]}) / $delta ); } sub pa { printf("%30s = %.0fn", $_[0], $q2{$_[0]}); } sub pm { $delta= ( ($now - $last) == 0 ? 1 : ( $now - $last) ); if ( $q1{$_[0]} != 0 ) { $S{$_[0]} += ($q2{$_[0]} - $q1{$_[0]})/$delta; $N{$_[0]}++; printf("%28s/s = %.0f media=%.1fn", $_[0], ($q2{$_[0]} - $q1{$_[0]}) / $delta, $S{$_[0]}/$N{$_[0]} ); } else { printf("%28s/s = %.0f media=---n", $_[0], ($q2{$_[0]} - $q1{$_[0]}) / $delta); } } sub pu { local ( $up, $days, $hours, $mins ); local($s,$M,$H,$d,$m,$y,$wd,$yd,$isdst)=localtime(time() - $q2{"Uptime"}); $up=$q2{"Uptime"}; $days=int($up/86400); $hours=int(($up - $days*86400) / 3600); $mins=int(($up - $days*86400 - $hours*3600)/60); printf("%30s = %.0f day(s), %.0f hour(s), %.0f min(s) (%04d/%02d/%02d %02d:%02d:%02d)n", "Uptime", $days, $hours, $mins, 1900+$y,$m+1,$d,$H,$M,$s); } sub pv { printf("%30s = %.1f%%n", $_[0], $_[1]); }