SHOW PROFILE [type[,type] ... ] [FOR QUERYn] [LIMITrow_count[OFFSEToffset]]type: ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS
        The SHOW PROFILES and
        SHOW PROFILE statements display
        profiling information that indicates resource usage for
        statements executed during the course of the current session.
      
        Profiling is controlled by the
        profiling session variable,
        which has a default value of 0 (OFF).
        Profiling is enabled by setting
        profiling to 1 or
        ON:
      
mysql> SET profiling = 1;
        SHOW PROFILES displays a list of
        the most recent statements sent to the master. The size of the
        list is controlled by the
        profiling_history_size session
        variable, which has a default value of 15. The maximum value is
        100. Setting the value to 0 has the practical effect of
        disabling profiling.
      
        All statements are profiled except SHOW
        PROFILES and SHOW
        PROFILE, so you will find neither of those statements
        in the profile list. Malformed statements are profiled. For
        example, SHOW PROFILING is an illegal
        statement, and a syntax error occurs if you try to execute it,
        but it will show up in the profiling list.
      
        SHOW PROFILE displays detailed
        information about a single statement. Without the FOR
        QUERY  clause, the output
        pertains to the most recently executed statement. If
        nFOR QUERY  is
        included, nSHOW PROFILE displays
        information for statement n. The
        values of n correspond to the
        Query_ID values displayed by
        SHOW PROFILES.
      
        The LIMIT
         clause may be
        given to limit the output to
        row_countrow_count rows. If
        LIMIT is given, OFFSET
         may be added to
        begin the output offsetoffset rows into the
        full set of rows.
      
        By default, SHOW PROFILE displays
        Status and Duration
        columns. The Status values are like the
        State values displayed by
        SHOW PROCESSLIST, althought there
        might be some minor differences in interpretion for the two
        statements for some status values (see
        Section 7.5.6, “Examining Thread Information”).
      
        Optional type values may be specified
        to display specific additional types of information:
      
            ALL displays all information
          
            BLOCK IO displays counts for block input
            and output operations
          
            CONTEXT SWITCHES displays counts for
            voluntary and involuntary context switches
          
            CPU displays user and system CPU usage
            times
          
            IPC displays counts for messages sent and
            received
          
            MEMORY is not currently implemented
          
            PAGE FAULTS displays counts for major and
            minor page faults
          
            SOURCE displays the names of functions
            from the source code, together with the name and line number
            of the file in which the function occurs
          
            SWAPS displays swap counts
          
Profiling is enabled per session. When a session ends, its profiling information is lost.
mysql>SELECT @@profiling;+-------------+ | @@profiling | +-------------+ | 0 | +-------------+ 1 row in set (0.00 sec) mysql>SET profiling = 1;Query OK, 0 rows affected (0.00 sec) mysql>DROP TABLE IF EXISTS t1;Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>CREATE TABLE T1 (id INT);Query OK, 0 rows affected (0.01 sec) mysql>SHOW PROFILES;+----------+----------+--------------------------+ | Query_ID | Duration | Query | +----------+----------+--------------------------+ | 0 | 0.000088 | SET PROFILING = 1 | | 1 | 0.000136 | DROP TABLE IF EXISTS t1 | | 2 | 0.011947 | CREATE TABLE t1 (id INT) | +----------+----------+--------------------------+ 3 rows in set (0.00 sec) mysql>SHOW PROFILE;+----------------------+----------+ | Status | Duration | +----------------------+----------+ | checking permissions | 0.000040 | | creating table | 0.000056 | | After create | 0.011363 | | query end | 0.000375 | | freeing items | 0.000089 | | logging slow query | 0.000019 | | cleaning up | 0.000005 | +----------------------+----------+ 7 rows in set (0.00 sec) mysql>SHOW PROFILE FOR QUERY 1;+--------------------+----------+ | Status | Duration | +--------------------+----------+ | query end | 0.000107 | | freeing items | 0.000008 | | logging slow query | 0.000015 | | cleaning up | 0.000006 | +--------------------+----------+ 4 rows in set (0.00 sec) mysql>SHOW PROFILE CPU FOR QUERY 2;+----------------------+----------+----------+------------+ | Status | Duration | CPU_user | CPU_system | +----------------------+----------+----------+------------+ | checking permissions | 0.000040 | 0.000038 | 0.000002 | | creating table | 0.000056 | 0.000028 | 0.000028 | | After create | 0.011363 | 0.000217 | 0.001571 | | query end | 0.000375 | 0.000013 | 0.000028 | | freeing items | 0.000089 | 0.000010 | 0.000014 | | logging slow query | 0.000019 | 0.000009 | 0.000010 | | cleaning up | 0.000005 | 0.000003 | 0.000002 | +----------------------+----------+----------+------------+ 7 rows in set (0.00 sec)
          Profiling is only partially functional on some architectures.
          For values that depend on the getrusage()
          system call, NULL is returned on systems
          such as Windows that do not support the call. In addition,
          profiling is per process and not per thread. This means that
          activity on threads within the server other than your own may
          affect the timing information that you see.
        
        You can also get profiling information from the
        PROFILING table in
        INFORMATION_SCHEMA. See
        Section 19.28, “The INFORMATION_SCHEMA PROFILING Table”. For example, the following
        queries produce the same result:
      
SHOW PROFILE FOR QUERY 2; SELECT STATE, FORMAT(DURATION, 6) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 2 ORDER BY SEQ;

User Comments
The disclaimer about getrusage() should be more explicit. You cannot get per-thread resource stats from getrusage() on Linux today. PeterG provides some details on this -- http://blogs.mysql.com/peterg/2008/11/06/show-profile-information_schemaprofiling/
Open PHP MyProfiler (http://www.php-trivandrum.org/open-php-myprofiler) is just a trial to run query profiling on a php-mysql application, without changing the architecture too much. Thanks to the built in profiler
Add your own comment.