
If you ever face an optimization issue in MySQL or MariaDB and want to know how to measure/benchmark the differences in execution between two queries, you should definitely know about the set profiling=1; command.
Here is how it works:
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT count(login_user_id) FROM stats.track_e_online WHERE DATE_ADD(login_date, INTERVAL 60 MINUTE) >= '2012-06-11 11:56:20';
+----------------------+
| count(login_user_id) |
+----------------------+
| 65 |
+----------------------+
1 row in set (0.00 sec)
mysql> show profile;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000022 |
| checking query cache for query | 0.000055 |
| checking permissions | 0.000010 |
| Opening tables | 0.000012 |
| System lock | 0.000005 |
| Table lock | 0.000023 |
| init | 0.000027 |
| optimizing | 0.000010 |
| statistics | 0.000008 |
| preparing | 0.000009 |
| executing | 0.000004 |
| Sending data | 0.001994 |
| end | 0.000006 |
| query end | 0.000004 |
| freeing items | 0.000014 |
| storing result in query cache | 0.000227 |
| logging slow query | 0.000004 |
| logging slow query | 0.000028 |
| cleaning up | 0.000003 |
+--------------------------------+----------+
19 rows in set (0.01 sec)
mysql> SELECT count(login_user_id) FROM stats.track_e_online WHERE '2012-06-11 11:56:20' <= DATE_ADD(login_date, INTERVAL 60 MINUTE);
+----------------------+
| count(login_user_id) |
+----------------------+
| 65 |
+----------------------+
1 row in set (0.00 sec)
mysql> show profile;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000032 |
| checking query cache for query | 0.000083 |
| checking permissions | 0.000014 |
| Opening tables | 0.000011 |
| System lock | 0.000005 |
| Table lock | 0.000031 |
| init | 0.000026 |
| optimizing | 0.000009 |
| statistics | 0.000008 |
| preparing | 0.000009 |
| executing | 0.000005 |
| Sending data | 0.001989 |
| end | 0.000007 |
| query end | 0.000003 |
| freeing items | 0.000015 |
| storing result in query cache | 0.000340 |
| logging slow query | 0.000005 |
| logging slow query | 0.000030 |
| cleaning up | 0.000003 |
+--------------------------------+----------+
19 rows in set (0.00 sec)
mysql> set profiling=0;
Query OK, 0 rows affected (0.00 sec)
Well, granted, there isn't much of a difference between those two examples. I believe that's because these queries have been stored in the query cache already, but you get the idea...
Note that profiling is a session variable, which means it only acts in your session of the MySQL/MariaDB client. You can find more information about
profiling in
the MySQL documentation pages.
Of course, this also works in the great
MariaDB server.