When a new version of MySQL is about to be released we read a lot of blog posts about the performance and scalability improvements. That’s good but sometimes we miss some small features that can help us a lot in our day-to-day tasks. One good example is the blog post that Aurimas wrote about a new small feature in MySQL 5.6 that I didn’t know about until I read it: the Automatic InnoDB transaction log file size change. How cool is that?
I plan to write a series of blog posts that will show some of those small new features in MySQL 5.7 that are going to be really useful. I’m going to start with EXPLAIN FOR CONNECTION.
This feature allows us to run an EXPLAIN for an already running statement. Let’s say that you find a query that has been running for a long time and you want to check why that could be happening. In 5.7 you can just ask MySQL to EXPLAIN the query that a particular connection is running and get the execution path. You can use it if the query is a SELECT, DELETE, INSERT, REPLACE or UPDATE. Won’t work if the query is a prepared statement though.
Let me show you an example of how it works.
We have a long running join.
mysql [localhost] {msandbox} ((none)) > show processlist G *************************** 1. row *************************** Id: 9 User: msandbox Host: localhost db: employees Command: Query Time: 49 State: Sending data Info: select count(*) from employees, salaries where employees.emp_no = salaries.emp_no
Let’s see the execution plan for the query:
mysql [localhost] {msandbox} ((none)) > explain for connection 9 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 299540 filtered: 100.00 Extra: NULL *************************** 2. row *************************** id: 1 select_type: SIMPLE table: salaries partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2803840 filtered: 100.00 Extra: Using where; Using join buffer (Block Nested Loop)
The join between those tables is not using any index at all so there is some room for improvement here Image may be NSFW.
Clik here to view.
Conclusion
You can use this feature to see why a query is running for too long and based on the info decide how to fix it and how to proceed. This is going to be a very useful feature for DBAs who want to diagnose performance problems and slow queries.
The post Getting EXPLAIN information from already running queries in MySQL 5.7 appeared first on MySQL Performance Blog.