Details
Description
To execute any command, a THD needs to be "attached" to the OS thread, which means, that
some variables in THD needs to be reset. This includes :
- set_current_thd() TLS variable, to thd
- mysys_var TLS variable., to thd->mysys_var
- THD::thread_stack and mysys_var.stack_ends_here
- THD::thread_id (pthread_self) "for debugging"
- os_thread_id (Linux only) - to be shown in SHOW PROCESSLIST. That's a system call
- some PFS thread local storage
Some of that is expensive, when run millions of times, specifically, getting the os_thread_id on Linux is a system call. pthread_self, while not as expensive is still a library call.
Also, current code used in THD::store_globals does a lot more currently, than it should do for threadpool, making thread_attach() on Linux about half as expensive as the inevitable epoll_ctl().
For simple commands like "do 1", thread_attaching can take as much as about 7% of the query execution overhead (excluding network IO)