In my previous post, I’ve showed how to use Dtrace to find queries creating disk temporary tables (only available for OS with dtrace: solaris, freebsd, etc).
In MySQL 5.6 (which is not released yet, use “labs” version for now) we can use new performance_schema table events_statements_history or events_statements_history_long to find all performance metrics for all queries including created disk/memory tables, use of index, etc. WOW! This is what I have been waiting for a long time!
To illustrate, I have grabbed mysql-5.6.3-labs-performance-schema-linux2.6-x86_64.tar.gz from labs.mysql.com (this feature is only in labs version) and run sysbench readonly test (you need to disable prepared statements in sysbench, seems to be not working with prepared statements, I will check it later).
Here are the results:
mysql> select * from events_statements_history_long where CREATED_TMP_DISK_TABLES > 0 limit 10\G
*************************** 10. row ***************************
THREAD_ID: 74
EVENT_ID: 3295633
EVENT_NAME: statement/sql/select
SOURCE: sql_parse.cc:935
TIMER_START: 633828149000000
TIMER_END: 633843868000000
TIMER_WAIT: 15719000000
LOCK_TIME: 53000000
SQL_TEXT: SELECT DISTINCT c from sbtest where id between 847399 and 847499 order by c
CURRENT_SCHEMA: sbtest
OBJECT_TYPE: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: NULL
MYSQL_ERRNO: 0
RETURNED_SQLSTATE: NULL
MESSAGE_TEXT: NULL
ERRORS: 0
WARNINGS: 0
ROWS_AFFECTED: 0
ROWS_SENT: 1
ROWS_EXAMINED: 103
CREATED_TMP_DISK_TABLES: 1
CREATED_TMP_TABLES: 1
SELECT_FULL_JOIN: 0
SELECT_FULL_RANGE_JOIN: 0
SELECT_RANGE: 1
SELECT_RANGE_CHECK: 0
SELECT_SCAN: 0
SORT_MERGE_PASSES: 0
SORT_RANGE: 0
SORT_ROWS: 1
SORT_SCAN: 1
NO_INDEX_USED: 0
NO_GOOD_INDEX_USED: 0
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
10 rows in set (0.00 sec)
Or if you need only list of queries:
mysql> select sql_text, count(*) as cnt from events_statements_history_long where CREATED_TMP_DISK_TABLES > 0 group by sql_text order by cnt desc limit 10; +-----------------------------------------------------------------------------+-----+ | sql_text | cnt | +-----------------------------------------------------------------------------+-----+ | SELECT DISTINCT c from sbtest where id between 242012 and 242112 order by c | 2 | | SELECT DISTINCT c from sbtest where id between 797388 and 797488 order by c | 2 | | SELECT DISTINCT c from sbtest where id between 973150 and 973250 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 478783 and 478883 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 967035 and 967135 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 602102 and 602202 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 123827 and 123927 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 980527 and 980627 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 450354 and 450454 order by c | 1 | | SELECT DISTINCT c from sbtest where id between 674804 and 674904 order by c | 1 | +-----------------------------------------------------------------------------+-----+ 10 rows in set (0.04 sec)
We can filter and order by rows_examined, SORT_MERGE_PASSES, NO_INDEX_USED, NO_GOOD_INDEX_USED, etc.
Links:
- What is new in MySQL 5.6: all long waited great features of MySQL 5.6 (btw: Multi-Threaded Slaves are coming up, now in labs only)
- A Big Bag of Epic Awesomeness, by Mark Leith
